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

最初のフィールドは行番号です。

いくつかの行番号引数を使用してスクリプトを呼び出すことができ、.txtがその行番号の最初と2番目のフィールドを印刷できるようにシェルスクリプトを作成しようとしていますdata.txt。たとえば、次のようget.sh 1 3 5に印刷する必要があります。

1           aFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
3           cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
5           eFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf

awkは最初と2番目のフィールドを印刷するためにのみ使用できると思いますが、シェルスクリプトに渡されたパラメータに基づいて特定の行のみをフィルタリングすることに閉じ込められています。よろしくお願いします。

ベストアンサー1

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()、次のようにループから配列を作成します。linesaforbこの配列には、興味のある行が含まれています。次に、NR in b現在の行番号と一致するキーが存在することを確認します。

各行は、入力に何回存在するかにかかわらず、一度だけ印刷され、行は引数で指定された順序ではなく入力番号の順序で印刷されます。

$ bash get.sh 7 3 3
3 cFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf
7 gFDLKSFD_FDSJFskadfsff_fsadklfj_fdsaf

get.sh 7,3,3また有効)

おすすめ記事