如何提取列然后进行求和并对其进行排序?

时间:2012-07-29 05:27:19

标签: sorting sed awk cut

我在提取列时遇到问题,因为并非每列都有一行。

看图:
http://www.dodaj.rs/f/1F/Fw/1dAklQ4M/snap008.jpg

现在我想列出列例如:

    "Label"   #2     #6    #sum of #2 and #6

我想按最后一栏排序,它是#sum的#2和#6

我该怎么做? THX

4 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

一般答案,如果您的输入具有“标准”awk / sort字段分隔符,则可能类似。

awk '{print $0, $2+$3}' | sort -n -k3

根据您的输入,您可能需要修改输入或命令管道。

答案 2 :(得分:0)

如果您知道有效输入的列数,请尝试此方法:

  awk 'NF > 5 {print $0, $2+$3 }' | sort -k3 -n

这只会处理至少5列的行。或者,如果有一个范围,你可以像

  awk 'NF > 5 && NF < 9 { ... }'  | sort ...

NF是一个预定义的AWK变量,表示当前行上的字段数(即用于您的目的的数据列)。以上示例过滤掉不符合条件的行(因此您可以将它们视为if语句的简短版本)

由于没有可用的测试数据,您必须根据需要进行调整。

答案 3 :(得分:0)

假设: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