-1

我有一个这样的文件:

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

换句话说,我需要从第二行开始每隔一行删除一次。

谢谢!

4

6 回答 6

6

鉴于您真正想要的输出,hek2mgl(已删除)的答案是正确的。

awk -F, '$2'

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

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

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

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

sed '/,$/d'

也就是说,删除以逗号结尾的每一行。我确定有更好的方法,我避免sed

如果您真的想显式删除每隔一行:

awk 'NR%2'

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

于 2013-11-09T01:11:49.080 回答
4

提供了一种简单的方法

awk 'NR % 2' file.txt
于 2013-11-09T01:06:45.120 回答
3

这可能对您有用(GNU sed):

sed '2~2d' file

或者:

sed 'n;d' file
于 2013-11-09T08:53:02.170 回答
1

这是提供的答案的gnu sed等价物。awk现在您可以通过指定备份扩展名安全地使用sed' -i标志:

sed -n -i.bak 'N;P' file.txt

请注意,gawk4也可以这样做:

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

结果:

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
于 2013-11-09T01:36:22.543 回答
1

如果 OPs 输入在最后一个数字之后不包含空格,或者,可以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 '!/,[ ]*$/'
于 2013-11-09T08:40:10.610 回答
0

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

于 2013-11-09T17:05:57.233 回答