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