我怎样才能有选择地唤醒一个字符串?

时间:2009-09-25 20:36:23

标签: awk

如果文件中有不确定宽度的文本行有文本“Line-to-reorder”,我只想翻转并显示前三个令牌的顺序:

# cat file.txt | awk '/Line-to-reorder/ { print $3 $2 $1 }'

如何让没有匹配条件的文本行不加改变?

其次,如何在匹配的行上显示其余的标记(行的其余部分)?

(awk是首选工具,因为我的嵌入式系统的busybox实现了它。)

4 个答案:

答案 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
}