【问题标题】:UNIX: How to print out specific lines in a file using sed/awk/grep?UNIX:如何使用 sed/awk/grep 打印文件中的特定行?
【发布时间】:2015-10-28 07:08:45
【问题描述】:

我在 Unix 中有一个通过命令获取并打印的数据:

line01
line02
line03
line04
line05
line06
line07
line08
line09
line10
line11
line12

我想把它整理出来,使第 10 到 12 行高于第 1 到 9 行。像这样:

line10
line11
line12
line01
line02
line03
line04
line05
line06
line07
line08
line09

我尝试使用

<command that fetches the data> | awk 'NR>=10 || NR<=9'

<command that fetches the data> | sed -n -e '4,5p' -e '1,3p'

但它仍然按排序顺序显示。我是 unix 新手,所以我不知道如何正确使用 awk/sed。

附言。这些数据存储在一个变量中,然后由另一个命令处理。所以我需要以这种方式对其进行排序,以便首先处理第 10-12 行。 :)

【问题讨论】:

    标签: sorting unix awk sed grep


    【解决方案1】:

    使用headtail

    $ tail -n 2 file && head -n 3 file
    name4
    name5
    name1
    name2
    name3
    

    您的awksed 方法不起作用,因为您只是说:打印行号X、Y 和Z,他们会在找到其中任何一个后立即执行。如果您想使用这些工具,您需要先读取文件,存储其内容,然后打印。

    $ awk -v OFS="\n"  '{a[NR]=$0} END {print a[4], a[5], a[1], a[2], a[3]}' file
    name4
    name5
    name1
    name2
    name3
    

    或者甚至将顺序作为变量给出:

    awk -v order="4 5 1 2 3" 
          'BEGIN {split(order,lines)}
           {a[NR]=$0} 
           END {for (i=1;i<=length(lines);i++) print a[lines[i]]}' file
    

    如果您想将行的顺序作为参数给出,您可以使用 process substitutionawk '...' &lt;(command) file 并使用 FNR/NR 来区分输入和文件

    或者您可以使用- 从标准输入读取作为第一个文件:

    echo "4 5 1 2 3" | awk 'FNR==NR {n=split($0,lines); next}
        {a[FNR]=$0}
        END {for (i=1;i<=n;i++) print a[lines[i]]}' - file
    

    作为单行:

    $ echo "4 5 1 2 3" | awk 'FNR==NR {n=split($0,lines); next} {a[FNR]=$0} END {for (i=1;i<=n;i++) print a[lines[i]]}' - a
    

    【讨论】:

    • 如果这些行不在文件中而只是由另一个命令获取怎么办。你还能流水线到尾部和头部的组合吗? :)
    • 最好用这些信息更新你的问题,并附上一个例子,这样它就更清楚了。现在听起来有点宽泛。
    • 呵呵。对不起。会做。 :)
    【解决方案2】:

    实际使用sort

    $ sort -r -s -k 1.5,1.5 /tmp/lines 
    line10
    line11
    line12
    line01
    line02
    line03
    line04
    line05
    line06
    line07
    line08
    line09
    

    -k 1.5,1.5 表示我只使用第一个单词的第 5 个字符进行排序。 -r 表示相反的顺序,-s 表示稳定 - 以相同顺序保留具有相同第 5 个字符的行。

    【讨论】:

    • 它现在可以工作了。谢谢!呵呵。但是“-s”标志未被识别,我尝试将其删除,但这些行的顺序正好相反。
    • 我已经在我的应用程序中应用了“sort -r”,因为我需要首先处理第 10 行和第 12 行。但是还有其他方法可以保持其他行不变吗?
    • 不知道。我的 man sort 没有提到 -s 是特别的东西。
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed '1h;2,9H;1,9d;12G' file
    

    用第 1 行替换保持空间,然后将第 2 到 9 行附加到保持空间并删除第 1 到 9 行。正常打印所有其他行,但在第 12 行将存储在保持空间中的行附加到模式空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2011-03-20
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多