Shell 打印第1列和第4列不同的行
我有一个文件,上面有一大堆这样的表格:Shell 打印第1列和第4列不同的行,shell,search,grep,multiple-columns,Shell,Search,Grep,Multiple Columns,我有一个文件,上面有一大堆这样的表格: 12 AAA 423 12 BBB beta^11 + 3*beta^10 18 AAA 1509 18 BBB -2*beta^17 - beta^16 18 AAA 781 12 BBB beta^16 - 5*beta^15 现在,我只想打印第1列和第4列不同的行(列是空格分隔的)(值AAA和BBB是固定的)。我知道我可以通过在第一列中获取所有可能的值,然后使用: for i in $values; do cat file.txt | grep
12 AAA 423 12 BBB beta^11 + 3*beta^10
18 AAA 1509 18 BBB -2*beta^17 - beta^16
18 AAA 781 12 BBB beta^16 - 5*beta^15
现在,我只想打印第1列和第4列不同的行(列是空格分隔的)(值AAA
和BBB
是固定的)。我知道我可以通过在第一列中获取所有可能的值,然后使用:
for i in $values; do
cat file.txt | grep "^$i" | grep -v " $i BBB"
done
但是,这在文件中运行的次数与第一列中显示的不同值的次数相同。有没有办法只需一次就可以做到这一点?我想我可以做比较,我的主要问题是我不知道如何提取以空格分隔的列。对于
awk
,这是一件非常简单的事情:
awk '$1 != $4' file
使用awk
,您使用$1
引用第一个字段,使用$2
引用第二个字段,依此类推。这样,您可以将第一个和第四个与$1!=$4
。如果这是真的(即,$1
和$4
不同),awk
执行其默认操作:打印当前行
对于您的示例输入,这是有效的:
$ awk '$1 != $4' file
18 AAA 781 12 BBB beta^16 - 5*beta^15
注意:您可以使用
-v FS=“…”
定义不同的字段分隔符。这样,您可以告诉awk
您的行包含字段tab/逗号/。。。分开。总之,它是这样的:awk-vfs=“\t””$1!=$4'文件
我只能说:哇!我真的应该好好学习awk
。我以为它可以用,但我不认为它这么简单。一旦可以,我就接受;)很高兴读到这篇文章:)awk
学习速度非常快,在小代码中提供了很好的效果。我建议您阅读这个有趣的教程:。它包括一些方便的箱子。干杯呆呆地看着awk的力量+1尽管设置字段分隔符的更简洁方法是直接使用-F
标志,而不是使用-v
选项设置变量<代码>awk-F'\t'$1!=$4’:)请注意,cat file.txt | grep“^$i”
可以压缩到grep“^$i”file.txt
@fedorqui感谢您指出这一点,我知道,但由于我需要两个连续的grep
s anywas,我更愿意将它们都压缩成管道;)