使用AWK或grep删除CSV文件中的每隔一行

时间:2013-11-09 01:04:43

标签: bash unix awk grep

我有一个这样的文件:

1000_Tv178.tif,34.88552709  
1000_Tv178.tif,  
1000_Tv178.tif,34.66987165  
1000_Tv178.tif,  
1001_Tv180.tif,65.51335742  
1001_Tv180.tif,  
1002_Tv184.tif,33.83784863  
1002_Tv184.tif,  
1002_Tv184.tif,22.82542442  
1002_Tv184.tif,  

如何使用简单的Bash命令将其设为这样? :

1000_Tv178.tif,34.88552709    
1000_Tv178.tif,34.66987165    
1001_Tv180.tif,65.51335742  
1002_Tv184.tif,33.83784863   
1002_Tv184.tif,22.82542442

换句话说,我需要删除所有其他行,从第二行开始。

谢谢!

6 个答案:

答案 0 :(得分:5)

鉴于你真正想要的输出,hek2mgl(删除)的答案是在正确的轨道上。

awk -F, '$2'

这就是说,打印第二个字段有值的每一行。

如果第二个字段具有值,但只是要排除的空格,请尝试以下操作:

awk -F, '$2~/.*[^[:space:]].*/'`

您也可以使用sed执行此操作:

sed '/,$/d'

其中说,删除以逗号结尾的每一行。我确信有更好的方法,我避免使用sed

如果你真的想要明确地删除所有其他行:

awk 'NR%2'

这就是说,打印模数为2的行号不为零的每一行。如果你真的想要删除每一个偶数行,那么它实际上并不重要,它是一个以逗号分隔的文件。< / p>

答案 1 :(得分:4)

提供了一种简单的方法

awk 'NR % 2' file.txt

答案 2 :(得分:3)

这可能适合你(GNU sed):

sed '2~2d' file

或:

sed 'n;d' file

答案 3 :(得分:1)

以下是gnu sed提供的awk个等效答案。现在,您可以通过指定备份扩展名安全地使用sed的{​​{1}}标记:

-i

请注意,sed -n -i.bak 'N;P' file.txt 也可以这样做:

gawk4

结果:

gawk -i inplace -v INPLACE_SUFFIX=".bak" 'NR%2==1' file.txt

答案 4 :(得分:1)

如果OP输入在最后一个数字后不包含空格,或,可以使用此awk

awk '!/,$/'
1000_Tv178.tif,34.88552709
1000_Tv178.tif,34.66987165
1001_Tv180.tif,65.51335742
1002_Tv184.tif,33.83784863
1002_Tv184.tif,22.82542442

,制动它之后的任何空间都没有强大。 这应该修复最后一个空格:

awk '!/,[ ]*$/'

答案 5 :(得分:0)

感谢您的帮助,但我也必须做一个解决方法: 将其读入R,然后再将其写出来。然后我安装了awk的GNU版本并使用了gawk'{if((FNR%2)!= 0){print $ 0}}'。所以,如果其他人有同样的问题,试试吧!