bash - awk - bash循环通过文件查找字符串开头

我有一个大文本文本,~ 10,000行数据,每行可能有不同的列数,例如:


789 KKPP 2018 08 09 10 20 30 AUTO A2987 10SM 5-MIN 22/13


790 KGOX 2018 08 09 10 20 35 AUTO P0002 21/19


...


798 KLXZ 2018 08 09 10 20 40 AUTO 18013GT 7SM 21/16 RMK A02 T02060156


799 KMNO 2018 08 09 10 20 45 AUTO 10SM P0001


...


...



我想循环遍历每一行,并且提取出现前缀"p00*"的第二列,例如,在上述的代码段中,我需要:


KGOX P0002


KMNO P0001



对应于第790行和第799行,列数完全是随机的,可以从一行更改为下一行。最重要的是,某些行的列以“P00 ”开头。

我有一个简单的读取循环:


 while IFS='' read -r line || [[ -n"${line}" ]];


 do


 temp=$(echo ${line} | awk '{print $7}')


 if [[ ${temp:0:3} =="P00" ]];


 then


 data=${temp}


 fi


 done



有没有更简单的方法来获取此信息,写入文本文件?

时间:

在你可以使用awk


awk '{match($0,/.*(P000[^ ]+).*/,a)} a[1]{print $2,a[1] }' input


KGOX P0002


KMNO P0001



这将搜索模式"P00*直到下一个空格,并将它存储到一个名为"a" 的数组

使用GNU sed:


sed -En 's/^[^ ]+ ([^ ]+).*( P00[^ ]*).*/12/p' file



输出:

KGOX P0002
KMNO P0001

也许你可以使用:


grep 'P00.' | cut -d' ' -f2



另一个简单的awk脚本(标准Linux gawk )


awk 'match($0,/P000[^ ]+/,a)/{print $2, a[0]}' input.txt



...