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

如何在Unix中使用awk从文本文件打印奇数字段?,unix,awk,printf,Unix,Awk,Printf,我以前也提出过同样的问题,但由于我只是Unix的初学者,我无法理解给出的答案,尽管这肯定有助于满足我的要求 awk -F\| '{s="";for (i=1;i<=NF;i+=2) {s=s?s FS $i:$i} print s}' file awk-F\|'{s=”“;for(i=1;i?:是awk提供的三元运算符 语法 表达式?值1:值2 如果表达式的计算结果为真,则三元表达式的值为value1elsevalue2 例如假设var=1 output=var==1?10:5; 这里由

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

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

awk-F\|'{s=”“;for(i=1;i
?:
是awk提供的三元运算符

语法

表达式?值1:值2

如果表达式的计算结果为真,则三元表达式的值为
value1
else
value2

例如假设
var=1

output=var==1?10:5;

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

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

  • s?
    s
    不为空时求值为真。即当它不处理第一列时。它设置
    s FS$i
    ,即
    s
    FS
    分隔

  • 当它计算为false时,即
    s==”
    它将
    s
    设置为第一列
    $i

这可确保fiels SEPERTOR
|
仅添加到除第一列之外的每列之前

理解一点,进一步考虑文件

$ 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

如果我们重新格式化您的awk代码,可能会更清楚:

{
  s = "";
  for (i = 1; i <= NF; i += 2)
  {
    s = s ? s FS $i : $i
  }
  print s
}

awk-F\|'{s=”“;用于(i=1;iIt是一个三元运算符,但它如何计算表达式并打印它?请解释这与我的回答有关。她说:太棒了!!你让我高兴了。谢谢你进一步分解它。非常棒的解释。谢谢你急需的帮助。@user3655102刚刚看到修改过的awk脚本。我已经分解了输出以及它是如何形成的。希望它现在清楚了:)非常感谢您的及时和详细的帮助。
{
  s = "";
  for (i = 1; i <= NF; i += 2)
  {
    s = s ? s FS $i : $i
  }
  print s
}
{
  s = $1;
  for (i = 3; i <= NF; i += 2)
  {
    s = s FS $i
  }
  print s
}
awk -F\| '{s="";for (i=1;i<=NF;i+=2) {s=s?s FS $i:$i} print s}' file