【问题标题】:Rearrange data into specified row lengths将数据重新排列为指定的行长
【发布时间】:2013-08-30 11:43:39
【问题描述】:

注意:我使用的是 OS X

我有一个数据文件,它只是一长串数字,每个条目单独一行:

    23
    28
    26
    14
    ...

我需要重新排列第 37 行记录/字段中的数据:

23 28 26 14 1 2 3 4 5 6 7 8 9 2 4 5 6 9 4 8 7 6 3 2 5 9 4 1 2 5 7 8 9 4 6 1 2
 5 8 6 4 3 5 23 28 26 14 1 2 3 4 5 6 7 8 9 2 4 5 6 9 4 8 7 6 3 2 5 9 4 1 2 5 7 
 ...

这是我尝试过的代码:

awk '{
    for(i=1;i<=NF;i+=1) { 
        if(i%37 != 0) printf $i" "; 
        else printf "$i\n" 
        }
     }' 
    input.txt > output.txt

第一个printf $i" " 似乎正在工作,但条件似乎有问题,因为无论我在else 语句中告诉它打印什么,它都不会打印它。也许只是语法疏忽??

有趣的是,当我刚刚运行时:

awk '{for(i=1;i<=NF;i+=1) printf $i" "}' input.txt > output.txt

生成的文件将 一些 数据放入 37 条记录长度的行中,但有些仍然更长...这可能是数据中某些伪影的结果吗? (数据已通过许多排序/组织功能运行。)

【问题讨论】:

  • 问题的症结在于您使用了“记录/字段”一词。它们不一样,您对差异感到困惑。文件由记录组成。每条记录由字段组成。默认记录分隔符是换行符。默认字段分隔符是一系列连续的空白。因此,您的输入文件包含 37 条记录,每条记录包含 1 个字段。您的脚本正在将 NF(当前记录中的字段数)与 37 进行比较。看到问题了吗?

标签: macos bash syntax awk


【解决方案1】:

一个可能对您有帮助的简单解决方案xargs -n37 &lt; file

演示

命令seq 只是打印由换行符分隔的数字序列(默认) 使用xargs -n3 我们可以将单个列分组为具有 3 个字段的记录:

$ seq 1 9 | xargs -n3 
1 2 3
4 5 6
7 8 9

【讨论】:

    【解决方案2】:

    NF 变量是记录中的字段数。您应该使用NR 变量,它代表记录号:

    awk '{printf NR%37?"%d ":"%d\n", $1}' file
    

    【讨论】:

    • 效果很好;谢谢!仍然不太明白为什么我的原始循环不起作用...我必须阅读更多内容才能准确了解您的单行 awk 正在做什么...但是谢谢!
    • @zephyr44 它使用三元运算符... ? ... : ... 。如果? 之前的值为真(非零),则使用?: 之间的值。如果为假(零),则使用: 之后的值。在这种情况下,如果记录号 NR 不是 37 的倍数,则使用的格式字符串为 "%d "。否则,如果是倍数,则格式字符串为"%s\n"
    猜你喜欢
    • 2021-12-07
    • 2021-11-11
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多