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

Bash 使用AWK或grep删除CSV文件中的每一行,bash,unix,awk,grep,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, 如何使用

我有这样一个文件:

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
换句话说,我需要每隔一行删除一行,从第二行开始

谢谢

提供了一种简单的方法

awk 'NR % 2' file.txt
考虑到您实际需要的输出,hek2mgl(已删除)的答案是正确的

awk -F, '$2'
也就是说,打印第二个字段有值的每一行

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

awk -F, '$2~/.*[^[:space:]].*/'`
您也可以使用sed执行此操作:

sed '/,$/d'
也就是说,删除以逗号结尾的每一行。我确信有更好的方法,我避免使用sed

如果确实要每隔一行显式删除一行,请执行以下操作:

awk 'NR%2'

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

下面是所提供的
awk
答案的
gnu-sed
等价物。现在,通过指定备份扩展名,您可以安全地使用
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

如果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 '!/,[ ]*$/'
这可能适用于您(GNU-sed):

或:


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

Thant什么也没做,确定它知道它的CSV文件吗?@user2966591,这个命令会将奇数行打印到标准输出,您可以重定向到一个文件。这不是你需要的吗?是的,我需要,但它写的是完全相同的文件。。有线。@user2966591 awk不是文件编辑器。它在溪流上运行。如果要写入文件,必须使用重定向。尝试以下操作:
awk'NR%2'文件>新建文件
。如果
newfile
具有您想要的内容,请用它替换旧文件。@user2966591或者您可以按照kojiro的建议使用
sed
,并使用
-i
选项(小心)。。请注意,
-i
仅在
sed
的GNU版本中可用。(Linux系统上常见):)已经很晚了,我必须承认我(有点)喝醉了……)为什么我的那个坏了?可以发誓它应该会工作。@hek2mgl你的没有工作,因为有两个字段。第二个是空的。啊,OPs输入确实在文本后包含空格。如果去掉这个,这确实有效,但不是一个非常可靠的解决方案。我想我只是做错了什么,因为什么都不起作用。。我会检查我的文件、命令等。非常感谢!现在它和其他建议一样有效,我必须安装GNU版本。sed'n;d',打印整个文件:/@user2966591:
2~2
符号是GNU-sed-specific。第二种选择在我测试过的任何地方都有效。你使用的是什么版本的sed?sed-n-i.bak'n;P'表示空白file@user2966591:使用您的输入,提供的命令可以正常工作。您确定正在使用最新的GNU
sed
和GNU
awk
?测试此
awk'{print'*“$0'*“}'
,以显示字符串前后是否有空格。这个
awk'!/,[]*$/”
在上面的测试数据上运行良好。来这里是为了这个逻辑。只要
FNR%2
就可以了,
{print}
是默认操作。非零到真的布尔等价是简洁的。所以
FNR%2{print}
但是。。不。第一个更好,这是一个班轮区域,所以冗余。
sed '2~2d' file
sed 'n;d' file