bash - 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 读取循环:
while IFS='' read -r line || [[ -n "${line}" ]];
do
temp=$(echo ${line} | awk '{print $7}')
if [[ ${temp:0:3} == "P00" ]];
then
data=${temp}
fi
done
但这很快就会变得一团糟,因为列号可能超过 30。有没有更简单的方法来获取这些信息,也许,写入文本文件?我知道 awk 可以做一些可能有效但无法正常工作的事情。
解决方案
使用 GNU sed:
sed -En 's/^[^ ]+ ([^ ]+).*( P00[^ ]*).*/\1\2/p' file
输出:
KGOX P0002 KMNO P0001
推荐阅读
- javascript - forEach loop skips modal opening
- javascript - 我可以通过单击一个按钮来调用一个组件,我可以直接在 onclick 事件值中传递一个组件吗?
- javascript - 我可以用 JSDOM 欺骗 instanceof 吗?
- python - np.interp 在脚本中失败 - 但在独立测试中失败?(ValueError:所需数组的对象深度太小)
- spring-boot - 为什么spring boot微服务的镜像库从alpine改成了ubuntu
- python - 如何保存包装在 sklearn 中的 keras 神经网络?
- c# - 天蓝色存储队列消息中的特殊字符
- android - 在 Flutter 中找不到参数的方法 implementation()
- html - apache2服务器离线时显示错误?
- mysql - 如何在 Spring Boot 中禁用自动创建表