我在提取列时遇到问题,因为并非每一列都有一行。
看图: http:
//www.dodaj.rs/f/1F/Fw/1dAklQ4M/snap008.jpg
现在我想列出列,例如:
"Label" #2 #6 #sum of #2 and #6
我想按最后一列排序,它是#2 和#6 的#sum
我怎样才能做到这一点?谢谢
我在提取列时遇到问题,因为并非每一列都有一行。
看图: http:
//www.dodaj.rs/f/1F/Fw/1dAklQ4M/snap008.jpg
现在我想列出列,例如:
"Label" #2 #6 #sum of #2 and #6
我想按最后一列排序,它是#2 和#6 的#sum
我怎样才能做到这一点?谢谢
如果您的输入具有“标准”awk/sort 字段分隔符,则一般答案可能类似于。
awk '{print $0, $2+$3}' | sort -n -k3
根据您的输入,您可能需要修改输入或命令管道。
假设: 1. 从 #1 开始的数字始终存在。2. 前面的栏目中没有列出数字。3. 第一个和第二个字段永远不会为空。
您可以查找第一个数字并从那里开始:
awk '{
# Look for the first digit
for( I=1 ; I<=NF ; I++ ) { if ( $I ~ /^[[:digit:]]+$/ ) { break } }
# Print the necessary fields
print $2, $(I+1), $(I+5), $(I)+$(I+5)
}' my_file
如果您知道有效输入的列数,请尝试此方法:
awk 'NF > 5 {print $0, $2+$3 }' | sort -k3 -n
这只会处理至少有 5 列的行。或者,如果有一个范围,你可以像
awk 'NF > 5 && NF < 9 { ... }' | sort ...
NF
是一个预定义的 AWK 变量,表示当前行上的字段数(即用于您的目的的数据列)。上面的示例过滤掉了不满足条件的行(因此您可以将它们视为 if 语句的简短版本)
由于没有可用的测试数据,您必须根据自己的需要进行调整。
使用 Gawk,您可以使用固定宽度的列来读取数据:
gawk -v FIELDWIDTHS="9 13 16 9 11 11 7 6 6 6 6 10 6 6 6 10 10" '{
print $2, $9, $13, $9 + $13
}'
请注意,仅从屏幕截图中猜测了列宽。宽度需要调整。
您也可以合并要忽略的列的列宽。
见https://www.gnu.org/software/gawk/manual/gawk.html#Constant-Size