我之前发布过同样的问题,但由于我只是 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 语句的情况下进行打印吗?请解释 。任何帮助将非常感激。谢谢。
? :是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设置s由FS分隔$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)