如果文件中有不确定宽度的文本行有文本“Line-to-reorder”,我只想翻转并显示前三个令牌的顺序:
# cat file.txt | awk '/Line-to-reorder/ { print $3 $2 $1 }'
如何让没有匹配条件的文本行不加改变?
其次,如何在匹配的行上显示其余的标记(行的其余部分)?
(awk是首选工具,因为我的嵌入式系统的busybox实现了它。)
答案 0 :(得分:3)
这个简单的脚本回答了你的问题:
awk '/Line-to-reorder/ {tmp = $1; $1 = $3; $3 = tmp} {print}' file.txt
cat
答案 1 :(得分:2)
没有必要执行任何if...else
,只需进行匹配/不匹配。
如果行匹配,则打印字段3,2和1,然后按原始顺序打印其余字段。如果没有,则按原样打印整行。
awk '/Line-to-reorder/ {printf "%s %s %s", $3, $2, $1; for (i=4; i<=NF; i++) {printf " %s", $i }; printf "\n"} !/Line-to-reorder/ {print}' file.txt
分为awk
脚本:
#!/usr/bin/awk -f
/Line-to-reorder/ {
printf "%s %s %s", $3, $2, $1
for (i=4; i<=NF; i++) {
printf " %s", $i
}
printf "\n"
}
!/Line-to-reorder/ {print}
使用以下内容运行:
awkscript file.txt
此awk
脚本将文件名作为参数(因为awk
会这样做),因此调用方法不需要cat
。
答案 2 :(得分:1)
这reference可能会有所帮助
答案 3 :(得分:1)
最佳选项可能是匹配所有行(无模式),然后在操作中执行if ... else
。
类似
{
if ($0 ~ /Line-to-reorder/)
print $3 $2 $1
else
print $0
}