当 awk 接收“0”作为输入时,它在某些情况下的行为会有所不同。代码如下:
var=$1
echo ""; echo -n 'o/p of $1=$1 ==>'; echo $var | awk '$1=$1'
echo "";echo -n 'o/p of {$1=$1;print} ==>';echo $var | awk '{$1=$1;print}'
echo "";echo -n 'o/p of $1==$1 ==>';echo $var | awk '$1==$1'
echo "";echo -n 'o/p of {$1==$1;print} ==>';echo $var | awk '{$1==$1;print}'
Run Code Online (Sandbox Code Playgroud)
带有“0”(数字零)的输出:
[root@host ~]# sh /tmp/te.sh 0
o/p of $1=$1 ==>
o/p of {$1=$1;print} ==>0
o/p of $1==$1 ==>0
o/p of {$1==$1;print} ==>0
[root@GORJALA ~]#
Run Code Online (Sandbox Code Playgroud)
带有“1”(第一) …
我有以下命令可以更改整个记录的字段分隔符
$ echo "DOWN_COMP_002_wget_001_6_2020-04-10-13_40_27_395533885" | awk 'BEGIN{FS="_|-";OFS="::"} {$i=$i } 1'
DOWN::COMP::002::wget::001::6::2020::04::10::13::40::27::395533885
Run Code Online (Sandbox Code Playgroud)
但我只想要最后七列,即 2020::04::10::13::40::27::395533885
我可以尝试这样做
$ echo "DOWN_COMP_002_wget_001_6_2020-04-10-13_40_27_395533885" | awk 'BEGIN{FS="_"} {for(i=7;i<=NF;i++) printf $i"::"}'
6::2020-04-10-13::40::27::395533885::
Run Code Online (Sandbox Code Playgroud)
但这会::
在最后添加一个我不想要的。
那么我怎样才能对最后 N 列使用 OFS 来做到这一点呢?
来自答案的结论:
我正在寻找 OFS 是否有任何可能的方法
我在下面看到的解决方案没有使用 OFS。所以不可能使用OFS
所以替代的解决方案是使用sed
或if
在awk
我已经知道的内部
所以只有当我们像下面这样手动操作时,OFS 才有用
print $1,$3,$5
Run Code Online (Sandbox Code Playgroud)
那么问题是:
那么有没有办法以print $1,$3,$5....
编程方式生成打印,以便自动使用 OFS。