使用Linux搜索字符串并以不同顺序打印行

时间:2019-02-23 22:20:12

标签: linux shell unix

我需要编写一个shell脚本,该脚本执行以下操作,下面以示例显示。

假设我有一个文件cars.txt,它描述了一个这样的表 Person|Car|Country “ |”是分隔符。所以前两行是这样的

Michael|Ford|USA
Rahul|Maruti|India 

我必须编写一个shell脚本,该脚本将在cars.txt文件中找到该国家/地区为美国的行,并将其打印为

USA|Ford|Michael

我不太擅长Unix,因此在这里我需要一些帮助。

2 个答案:

答案 0 :(得分:-1)

这会吗?

Parse

答案 1 :(得分:-1)

已更新为查找USA而不是您的问题中提供的第一行

使用awk,您可以以非常简单的方式进行尝试,例如

$ awk -F'|' '/USA/ {for (i = NF; i >= 1; i--) printf "%s%s", $i, i==1 ? RS : FS}' cars.txt
USA|Ford|Michael
India|Maruti|Rahul

说明

  • awk -F'|'使用'|'作为 Field-Separator (在呼叫开始时指定为-F'|'或{{1})读取文件},在命令本身中
  • FS仅查找包含/USA/的行,
  • "USA"-以相反的顺序遍历字段,
  • for (i = NF; i >= 1; i--)-如果printf "%s%s", $i, i==1 ? RS : FS不等于'|',则输出字段,然后输出FSi)或 Record-Separator 1),如果RS等于"\n",则默认为i。形式1只是三元运算符,用于测试test ? true_val : false_val是否提供i == 1用于输出,否则提供RS用于输出。 / li>

比使用命令替换FSgrep(加上管道)产生8个子壳要快几个数量级。

仅打印包含cut的行的第一次出现

要仅打印"USA"的第一行,您要做的就是处理后"USA",例如

exit

说明

  • 仅在命令末尾添加$ awk -F'|' '/USA/ {for (i = NF; i >= 1; i--) printf "%s%s", $i, i==1 ? RS : FS; exit}' cars.txt USA|Ford|Michael 会导致exit在第一个记录之后停止处理记录。

尽管awkawk都花了一些时间与之交朋友,但它们一起提供了Unix-Swiss-Army-Knife来进行文本处理。非常值得花时间学习两者。通过其中一个教程,只需几个小时即可获得良好的基础。祝您脚本工作顺利。