【问题标题】:Print one line from file从文件中打印一行
【发布时间】:2014-03-12 14:30:15
【问题描述】:

我正在尝试读取如下所示的文件:

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 或其他东西,一旦我开始工作,我可以用它来按数字顺序排列它吗?

【问题讨论】:

  • 如果您只想在一行中对输入进行排序,请尝试perl -pale '$_ = join(" ", sort @F)'

标签: linux awk


【解决方案1】:

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

【讨论】:

  • @Tree55Topz &lt;= NF。你需要=
  • 太棒了!你有没有机会知道我可以把它从最小到最大排序的方法?类似 sort -nr?
  • @Tree55Topz 您可以通过管道到sort -n从最小到最大进行排序。说sort -nr 会以相反的顺序对其进行排序,即从大到小。
  • @devnull 语法如何实现?我做了 awk '{for(i=1; i
  • @Tree55Topz 假设你的文件是你所说的 1 行,awk '{for(i=1; i&lt;=NF; i++) printf("%d ",$i)}' filename | sort -n
【解决方案2】:

您的问题是$0$1$NF 是字段。所以你需要从1而不是0开始,你需要使用&lt;= NF而不是&lt;

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)。

请注意,无论您选择awk tr 解决方案,通过这些sort 命令之一的管道都将起作用。

【讨论】:

    【解决方案3】:

    对于单行,可以在awk中使用while

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      相关资源
      最近更新 更多