Bash
如何提取作為參數傳遞給 bash 腳本的特定行號的欄位?
我有一個名為
data.txt
以下內容的文件:1 aFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 2 bFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 3 cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 4 dFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 5 eFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 6 fFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 7 gFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 8 hFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 9 iFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 10 jFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234 11 kFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf IT524234
請注意,第一個欄位是行號。
現在我想建構一個 shell 腳本,這樣我就可以使用一些行號參數呼叫該腳本,並且它應該列印出
data.txt
. 例如:get.sh 1 3 5
應該列印:1 aFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf 3 cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf 5 eFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
我認為 awk 只能用於列印第一個和第二個欄位,但我只能根據傳遞給 shell 腳本的參數過濾特定的行。提前致謝。
在 awk 中,您可以將行號收集到一個數組並讀取一次文件,列印數組中提到的行:
#!/bin/sh awk -v lines="$*" 'BEGIN { split(lines, a, "[, ]"); for (i in a) b[a[i]] = 1;} NR in b {print $1, $2}' < data.txt
將
split()
變數lines
沿空格和逗號拆分為數組a
,然後for
循環建構數組b
,使該數組的鍵包含我們感興趣的行。然後NR in b
只檢查與目前行號匹配的鍵是否存在。請注意,這將只列印每行一次,無論它在輸入中存在多少次,並且這些行將被列印輸入數字順序,而不是參數給出的順序:
$ bash get.sh 7 3 3 3 cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf 7 gFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
(
get.sh 7,3,3
也可以)