AWK 列印與以某種特定格式、範圍等輸入的使用者輸入相符的行

AWK 列印與以某種特定格式、範圍等輸入的使用者輸入相符的行

我有一個包含以下內容的文件/tmp/a.txt

1
2
3
4
5

使用AWK,我想提示使用者指定以下任意格式的範圍並列印匹配的行。

逗號分隔

1,2,3

空間分隔

1 2 3

並在範圍內使用 -

1-3

預期輸出:

1
2
3

下面是用於捕獲用戶輸入的範例 awk 命令,我應該在此處放置什麼以獲得所需的輸出。

 awk 'BEGIN { printf "Enter the range: " ; getline name < "-" }{?}' /tmp/a.txt

答案1

您可以使用此awk命令:

awk 'BEGIN { printf "Enter the range: " ; getline r < "-"; split(r,a,"[ ,]")} \
  {for (i in a){split(a[i],b,"-"); if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR)){print}}}' file

解釋:

  • printf "Enter the range: " ; getline r < "-";從問題複製(將使用者輸入讀取到變數中r
  • split(r,a,"[ ,]")在分隔符號空格和逗號處分割輸入並將它們寫入 array a
  • for (i in a)對於 awk 處理的每一行,它都會循環遍歷數組a
    • split(a[i],b,"-")中的每個元素a在分隔符號處再次拆分-,然後將範圍保存在 array 中b
    • if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR))如果目前正在處理的行號awk位於數組中a,或者行號位於數組中的兩個數字之間b...
      • {print}....列印該行。

您也可以使用組合輸入,例如

1-3,4 5 7-13

答案2

目前尚不清楚您是否希望行號 ( NR) 與輸入的範圍匹配,或整行的 ( $0) 或第一個欄位的 ( $1) 值...嘗試

awk '
BEGIN   {printf "Enter the range: "
         getline ANS < "/dev/tty"
         for (n=split (ANS, T, "[ ,]"); n; n--) {for (m=split (T[n], R, "-"); m; m--)   TGT[R[m]]
                                                 for (i=R[1]+1; i<R[2]; i++)            TGT[i]
                                                }
        }
$1 in TGT
' file
Enter the range: 1-3
1
2
3

並更改$1$0NR

相關內容