根据第二个字段值打印行,不使用循环

Print line based on 2nd field value, without using a loop

我尝试在不使用循环的情况下从文件中检索一行。

myFile.txt

val1;a;b;c
val2;b;d;e
val3;c;r;f

我想获取第二列为 b 的行。

如果我这样做 grep "b" myFile.txt 那么第一行和第二行都会被输出。

如果我这样做 cat myFile.txt | cut -d ';' -f2 | grep "b" 那么输出将只是 b 而我想要得到完整的行 val2;b;d;e.

有没有一种方法可以在不使用如下循环的情况下达到预期的结果?我的文件很大,一次又一次地循环浏览它并不是一件好事。

while read line; do
   if [ `echo $line | cut -d ';' -f2` = "b" ]; then
      echo $line
   fi
done < myFile.txt

给定你的输入文件,下面的一行代码应该可以工作:

awk -F";" ' == "b" {print}' myFile.txt

解释:

awk -F";"                    ##Field Separator as ";"
' == "b"                   ##Searches for "b" in the second column()
{print}'                     ##prints the searched line

使用:

  1. grep:

    grep '^[^;]*;b;' myFile.txt
    
  2. sed:

    sed '/^[^;]*;b;/!d' myFile.txt
    

两者的输出相同:

val2;b;d;e