【问题标题】:linux print last row of all columns of data with varying row numbers for columnslinux打印所有数据列的最后一行,列的行号不同
【发布时间】:2014-06-17 03:02:21
【问题描述】:

我有一个格式的文件,

1  1.0  1   1.0   1   2.0   1    3.0
2  2.0  2   3.0             2 
3  2.0  3   4.0
4  6.0 
5  3.0

我想打印所有列的最后一行。在实际数据中,行数和列数在 100s 范围内。 我尝试过使用 tail、awk 和 cut 命令,但没有成功。

期望的输出

5 3.0   3 4.0  1 2.0  1 3.0

【问题讨论】:

  • 你试过什么?注意,第 7 行的 2 可以很容易地被 awk 考虑在第 5 行。
  • 您能说明一下您的文件格式吗?第 2 行是否故意没有数据?还有为什么没有出现第 4 行?
  • @MannyD 请注意,所需的输出显示每列的最后一行:5 第一,3.0 第二,3 第三,4.0第四...
  • 您的数据是已知的固定宽度格式吗?是否有特定的字段分隔符?还是只是“空白”
  • 输出中的最后一个“1”应该是“2”吗?如果不是,为什么不呢?您的字段是固定宽度还是制表符分隔或其他?

标签: unix awk cut


【解决方案1】:

我认为此时最简单的做法就是用您选择的脚本语言(Python、Ruby 等)编写一些东西。该过程可能如下所示:

for line in file:
  columns = break_into_columns(line)
  #a good column format might be [[1, 1.0], [1, 1.0], [1, 2.0], [1, 3.0]]
  for i in len(columns):
    if columns[i][1]==None:
      if cache[i]!= None:    #so we only print the last item once
        print cache[i]
  cache = columns

【讨论】:

    【解决方案2】:

    awk 的解决方案可能如下

    awk '{for(i=1;i<=NF;++i){A[i] = $i}} END {for(i in A){str = str" "A[i];} print str}' test.dat
    

    这个输出

    5 3.0 3 4.0 2 2.0 1 3.0
    

    它的工作方式是,awk 读取每一行,我告诉它将每个 nth 列存储到数组 A 中的相应位置。如果列中没有数字,则不会覆盖前一个数字,因此在文件的末尾,数组A 应该包含每列的最后一个数字。然后我们就打印这个数组

    注意你说想要的输出是

    5 3.0   3 4.0  1 2.0  1 3.0
    

    但是从您输入的第五个和/或第七个数字11 分别没有意义。第二行的最后一个2 是否被视为第五列或第七列中的数字?

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 2012-10-14
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      相关资源
      最近更新 更多