【问题标题】:How to extract column then make a sum and sort it?如何提取列然后求和并排序?
【发布时间】:2012-07-27 06:15:30
【问题描述】:

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

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

现在我想列出列例如:

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

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

我该怎么做? 谢谢

【问题讨论】:

  • 发布一些测试输入和所需的输出。还有what you have tried.
  • 如果您的 cmets 中的所有附加/澄清信息都添加到您的原始帖子中,您的问题可能会得到更好的说明。还要确保提及所有约束,以便您可以获得一些有效的帮助。不是每个人都阅读所有的 cmets。 Thor 是对的,提供一些可用的示例输入(我将如何针对 .jpg 图像测试解决方案)和一些明确的所需输出)。
  • 您在每个答案中添加条件来解决问题作为 cmets 意味着:a.)您的问题没有明确指定,b.)您没有探索整个情况以确切知道什么你需要

标签: sorting sed awk cut


【解决方案1】:

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

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

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

【讨论】:

  • 但问题是通常使用的 awk 无法按我的意愿工作。那是因为不是每一列都被填满。
【解决方案2】:

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

【讨论】:

  • FIELDWIDTHS(不是FILEDWIDTHS)是列宽列表。例如,对于FIELDWIDTHS="9 13 16"gawk 将使用前 9 个字符作为第 1 列 ($1),接下来的 13 个字符作为第 2 列,接下来的 16 个字符作为第 3 列。
  • Ufff..这不是我想要的..我忘了说我的桌子是动态的,而且它每次都改变,所以你的解决方案对我来说是不可接受的..谢谢帮助,但在那里还有其他解决方案吗?
【解决方案3】:

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

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

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

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

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

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

【讨论】:

  • Thx..但它传递了一些我不需要它的coloumn..无论如何谢谢帮助!
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多