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()
、次のようにループから配列を作成します。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
また有効)