如何在 Unix 中使用 awk 从文本文件打印奇数字段?

Str*_*der 0 unix awk printf

我之前发布过同样的问题,但由于我只是 Unix 的初学者,我无法理解给出的答案,尽管这肯定有助于满足我的要求。

awk -F\| '{s="";for (i=1;i<=NF;i+=2) {s=s?s FS $i:$i} print s}' file
Run Code Online (Sandbox Code Playgroud)

这个 {s=s?s FS $i:$i} print s} 是做什么的?它如何打印所需的输出?我无法理解。这是 Unix 中的一种特殊运算符,可以在不使用 print 或 printf 语句的情况下进行打印吗?请解释 。任何帮助将非常感激。谢谢。

nu1*_*73R 5

? :是awk提供的三元运算符

句法

expression ? value 1 : value 2

如果表达式的值为 true,则三元表达式的值为value1elsevalue2

例如假设var =1

output=var==1 ? 10 : 5;

这里由于计算结果为 true,因此var==1三元运算符的值变为10output10

现在什么{s=s?s FS $i:$i} print s}

  • s ?s当不为空时评估 true 。那是当它不处理第一列时。它s FS $i设置sFS分隔$i

  • 当它评估为 false 时,即s==""设置s为第一列$i

这可确保仅在除第一列之外的每一列之前|添加字段分隔符

为了进一步理解一点,考虑一个文件

$ cat input
one|two|three|four|five|six
$ awk -F\| '{s="";for (i=1;i<=NF;i+=2) { {s=s?s FS $i:$i} print s }}' input
Run Code Online (Sandbox Code Playgroud)

这里循环print s的每次迭代都for给出输出

one                   <= s="", evaluates false, hence no FS, | added to column
one|three             <= s=one, evaluates true, hence FS, | added to column and so on 
one|three|five
Run Code Online (Sandbox Code Playgroud)