基于第二个字段值打印行,不使用循环

我尝试从文件中检索一行而不使用循环 .

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

回答(2)

2 years ago

鉴于您的输入文件,下面的单行应该工作:

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

说明:

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

2 years ago

使用:

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

两者的输出相同:

val2;b;d;e