
我有一個包含以下內容的文件/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,"[ ,]")
在分隔符號空格和逗號處分割輸入並將它們寫入 arraya
。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
為$0
或NR
。