使用awk格式化输出

时间:2019-02-22 10:50:02

标签: bash awk

我有一个包含以下内容的文件:

A 28713.64                  27736.1000
B 9835.32
C 38548.96

现在,我需要检查第一列中的最后一行是否为'C',然后第三列中的第一行的值应与'C'一起打印在第三列中。

预期输出:

A 28713.64                  27736.1000
B 9835.32
C 38548.96                  27736.1000

我在下面尝试过,但是不起作用:

awk '{if ($1 == "C") ; print $1,$2,$3}' file_name

非常欢迎任何帮助!

3 个答案:

答案 0 :(得分:2)

这适用于给定的示例:

awk 'NR==1{v=$3}$1=="C"{$0=$0 FS v}7' file|column -t

如果要将第三列值从A行追加到C行,请将NR==1更改为$1=="A"

column -t部分仅用于使输出漂亮。 :-)

答案 1 :(得分:2)

编辑: 根据OP的注释,OP正在寻找第一行,并在输入文件的最后一行匹配C字符串,如果这是这种情况下,应该尝试遵循。

awk '
FNR==1{
  value=$NF
  print
  next
}
prev{
  print prev
}
{
  prev=$0
  prev_first=$1
}
END{
  if(prev_first=="C"){
      print prev,value
  }
  else{
      print
  }
}'  file | column -t


假设您的实际Input_file与所示示例相同,并且您想从第一列中选​​取值为A的值。

awk '$1=="A" && FNR==1{value=$NF} $1=="C"{print $0,value;next} 1' Input_file| column -t

输出如下。

A  28713.64  27736.1000
B  9835.32
C  38548.96  27736.1000

答案 2 :(得分:2)

POSIX指示“ 分配给不存在的字段(例如,$(NF + 2)= 5)将增加NF的值;创建带有未初始化值的任何中间字段;并导致值$ 0要重新计算,其中的字段由OFS的值分隔。

所以...

awk 'NR==1{x=$3} $1=="C"{$3=x} 1' input.txt

请注意,输出的格式不正确,但是此处的大多数解决方案都可能是这种情况。如Ravinder所建议的,您可以通过column传递输出。或者,您可以通过使用printf打印数据来精确地控制事物。

awk 'NR==1{x=$3} $1=="C"{$3=x} {printf "%-2s%-26s%s\n",$1,$2,$3}' input.txt

如果您的行可以用printf格式表示,则可以避免column -t的不可预测性并节省管道的开销。