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

时间:2018-12-10 09:55:28

标签: bash shell loops while-loop ksh

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

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 个答案:

答案 0 :(得分:2)

给出您的输入文件,以下一线应该可以工作:

var ctx = document.getElementById("myChart").getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', data: { labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: 'rgba(255, 99, 132, 0.2)', borderColor: 'rgba(255,99,132,1)', borderWidth: 1 }, { label: '# of Votes1', data: [17, 9, 13, 9, 20, 13], backgroundColor: 'rgba(54, 162, 235, 0.2)', borderColor: 'rgba(54, 162, 235, 1)', borderWidth: 1 }, { label: '# of Votes2', data: [1, 6, 13, 12, 20, 5], backgroundColor: 'rgba(255, 206, 86, 0.2)', borderColor: 'rgba(255, 206, 86, 1)', borderWidth: 1 }] }, options: { scales: { yAxes: [{ ticks: { beginAtZero: true } }] } } }); function copyChart() { Chart.helpers.each(Chart.instances, function(instance) { var ctxCopy = document.getElementById("myChartCopy").getContext('2d'); new Chart(ctxCopy, instance.config); }); }

说明:

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

答案 1 :(得分:0)

使用:

  1. grep

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

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

两者的输出相同:

val2;b;d;e