2010-04-20 35 views
1

例如,我需要删除第25列,并将其替换为第22列的副本,但不包含嵌入的分隔符。我能想出的最好的是尴尬的看着: 在分隔文件中将一列复制到另一列

 
awk -F, '{ for(x=1;x<25;x++){printf("%s,", $x)};printf("%s,",$22);for(x=26;x<59;x++){printf 
("%s,", $x)};print $59}' 
I would expect something like
 
cut -d, -f1-24,23,26-59 
to work but cut doesn't seem to want to print the same column two times...

Is there a more elegant way to do it using anything typicaly available in a linux shell environment?

+0

这是一种可悲的是切不支持,那肯定是一个非常有用的功能。 – 2010-04-20 16:19:23

+0

'cut'不重新排列列,或者:'echo -e“a \ tb \ tc”| cut -f 3,2,1'结果为“a [tab] b [tab] c” – 2010-04-20 17:07:56

回答

4

只要告诉AWK与现场更换田地25 22

awk 'BEGIN{FS=","; OFS=","} {$25=$22; print}' < test.csv 
+1

不需要输入重定向 - awk将文件名作为参数。 – Cascabel 2010-04-20 16:33:44

+0

我不知道如何在不列举列的情况下进行打印。这是很好的知道。 – frankc 2010-04-20 20:37:47

0

It's not elegant, but pastecoreutils一部分,应该是可用的,但它会采取一些临时文件:

$ cat test.csv 
one,two,three,four,five,six,seven 
1,2,3,4,5,6,7 
$ cut -d, -f1-5 test.csv > start.txt 
$ cut -d, -f3 test.csv> replace.txt 
$ cut -d, -f7 test.csv > end.txt 
$ paste -d, start.txt replace.txt end.txt 
one,two,three,four,five,three,seven 
1,2,3,4,5,3,7 

或者,您可以跳过最后一个临时文件,并使用标准输入:

$ cut -d, -f7 test.csv | paste -d, start.txt replace.txt - 
one,two,three,four,five,three,seven 
1,2,3,4,5,3,7 
+0

'cat'的无用用途。 – 2010-04-20 17:04:16

+0

@丹尼斯 - 点,纠正。 – 2010-04-20 17:08:56

0

这可能会实现FO R您:

echo '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26' | 
sed 's/^\(\([^,]*,\)\{21\}\([^,]*,\)\([^,]*,\)\{2\}\)[^,]*,/\1\3/' 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,22,26 

或者如果你喜欢:

echo '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26' | 
sed -r 's/^(([^,]*,){21}([^,]*,)([^,]*,){2})[^,]*,/\1\3/' 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,22,26 
相关问题