将数据重新排列为指定的行长度

时间:2013-08-27 15:56:20

标签: macos bash syntax awk

注意:我正在使用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个记录长度的行中,但有些仍然长得多......这可能是数据中某些工件的结果吗? (数据已通过许多排序/组织功能运行。)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

<强>演示

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

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