簡體   English   中英

UNIX:如何使用sed / awk / grep打印文件中的特定行?

[英]UNIX: How to print out specific lines in a file using sed/awk/grep?

我在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。

PS。 這些數據存儲在變量中,然后將由另一個命令處理。 所以我需要將其排序,以便首先處理10-12行。 :)

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

如果要將行的順序作為參數給出,則可以使用流程替換awk '...' <(command) file然后使用FNR / NR來區分輸入和文件

或者,您可以使用-作為第一個文件從stdin讀取:

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

這可能對您有用(GNU sed):

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

將保留空間替換為第1行,然后將第2到9行添加到保留空間,並刪除第1到9行。正常打印所有其他行,但在第12行上將存儲在保留空間中的行追加到模式空間。

實際使用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個字符的行以相同順序排列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM