Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 打印第1列和第4列不同的行_Shell_Search_Grep_Multiple Columns - Fatal编程技术网

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,我更愿意将它们都压缩成管道;)