Bash

如何提取作為參數傳遞給 bash 腳本的特定行號的欄位?

  • May 10, 2021

我有一個名為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也可以)

引用自:https://unix.stackexchange.com/questions/648101