相关疑难解决方法(0)

如果值为 0(数字零),为什么 awk 对 $1 的行为不同?

当 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”(第一) …

awk

5
推荐指数
3
解决办法
2672
查看次数

awk:打印最后 N 列但使用不同的字段分隔符

我有以下命令可以更改整个记录的字段分隔符

$ 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

所以替代的解决方案是使用sedifawk我已经知道的内部

所以只有当我们像下面这样手动操作时,OFS 才有用

 print $1,$3,$5
Run Code Online (Sandbox Code Playgroud)

那么问题是: 那么有没有办法以print $1,$3,$5....编程方式生成打印,以便自动使用 OFS。

awk text-processing

1
推荐指数
1
解决办法
831
查看次数

标签 统计

awk ×2

text-processing ×1