我需要编写一个shell脚本,该脚本执行以下操作,下面以示例显示。
假设我有一个文件cars.txt
,它描述了一个这样的表
Person|Car|Country
“ |”是分隔符。所以前两行是这样的
Michael|Ford|USA
Rahul|Maruti|India
我必须编写一个shell脚本,该脚本将在cars.txt
文件中找到该国家/地区为美国的行,并将其打印为
USA|Ford|Michael
我不太擅长Unix,因此在这里我需要一些帮助。
答案 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
不等于'|'
,则输出字段,然后输出FS
(i
)或 Record-Separator (1
),如果RS
等于"\n"
,则默认为i
。形式1
只是三元运算符,用于测试test ? true_val : false_val
是否提供i == 1
用于输出,否则提供RS
用于输出。 / li>
比使用命令替换,FS
和grep
(加上管道)产生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
在第一个记录之后停止处理记录。尽管awk
和awk
都花了一些时间与之交朋友,但它们一起提供了Unix-Swiss-Army-Knife来进行文本处理。非常值得花时间学习两者。通过其中一个教程,只需几个小时即可获得良好的基础。祝您脚本工作顺利。