我正在尝试阅读一个看起来像这样的文件:
90 80 70 60
这是我的代码:
#!/bin/bash
awk '{for(i=0; i<NF; i++) printf("%d\n",$i)}'
打印90 90 80 70.为什么要重新打印90而不是60?另外,一旦我开始工作,我是否可以使用sort -nr
或其他东西将其按数字顺序排列?
答案 0 :(得分:2)
awk
中的字段是从1开始的,而不是从0开始的。
你需要说:
awk '{for(i=1; i<=NF; i++) printf("%d\n",$i)}'
它打印90
两次,因为$0
表示整行,printf
格式占据该行的第一个字段并生成90
。稍后i
等于1
到3
,您会获得其他值,即前三个字段。
将printf
替换为print
,它将明显:
$ echo "90 80 70 60" | awk '{for(i=0; i<NF; i++) print $i}'
90 80 70 60
90
80
70
答案 1 :(得分:0)
您的问题是$0
是行,$1
到$NF
是字段。因此,您需要从1
开始,而不是0
,您需要使用<= NF
而不是<
:
awk '{ for (i = 1; i <= NF; i++) printf ("%d\n", $i) }' <inputFile
但是,如果您的文件在项目之间只有单个空格,则有一个更短的方式:
tr ' ' '\n' <inputFile
将用换行符替换所有空格。给定输入文件:
1 2 3 4
90 80 70 60
这两个产生:
1
2
3
4
90
80
70
60
而且,是的,是您可以使用的数字排序,sort -n
:
tr ' ' '\n' <inputFile | sort -n
会给你:
1
2
3
4
60
70
80
90
(当然,sort -nr
为您提供相反的顺序,90
到1
。)
请注意,无论您选择sort
还是 awk
解决方案,通过其中一个tr
命令进行管道传输都会有效。
答案 2 :(得分:0)
对于单行,您可以在while
awk
echo "90 80 70 60" | awk '{while(i++<NF) print $i}'
90
80
70
60