我有一个包含以下内容的文件:
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
非常欢迎任何帮助!
答案 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
的不可预测性并节省管道的开销。