1

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

4

2 回答 2

1

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

awk '{printf NR%37?"%d ":"%d\n", $1}' file
于 2013-08-27T16:05:11.227 回答
1

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

演示

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

$ seq 1 9 | xargs -n3 
1 2 3
4 5 6
7 8 9
于 2013-08-27T17:25:51.467 回答