从文件中打印一行

时间:2014-03-12 03:09:34

标签: linux awk

我正在尝试阅读一个看起来像这样的文件:

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或其他东西将其按数字顺序排列?

3 个答案:

答案 0 :(得分:2)

awk中的字段是从1开始的,而不是从0开始的。

你需要说:

awk '{for(i=1; i<=NF; i++) printf("%d\n",$i)}'

它打印90两次,因为$0表示整行,printf格式占据该行的第一个字段并生成90。稍后i等于13,您会获得其他值,即前三个字段。

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为您提供相反的顺序,901。)

请注意,无论您选择sort 还是 awk解决方案,通过其中一个tr命令进行管道传输都会有效。

答案 2 :(得分:0)

对于单行,您可以在while

中使用awk
echo "90 80 70 60" | awk '{while(i++<NF) print $i}'
90
80
70
60