頑張る
for ds in $(cat Nikhil/strings.txt )
do
awk -v k="$ds" '{if (substr($0,2,5) == k )print $0}' criteria5.txt
done
ただし、これを行うと、変数の代わりにk値がkとして提供されます。 Shell check .netが機能しないため、ここに投稿する必要がありました。
+ for ds in '$(cat Nikhil/strings.txt )'
+ awk -v k=CDA01 '{if (substr($0,2,5) == k )print $0}' criteria5.txt
これはsh -xを使用してデバッグを試みたときの出力です。どんな提案でもお願いします
答え1
あなたのコードで何が起こっているのかを再現することはできませんが、すべてが構文的に優れていて動作することがわかりました。しかし、これはシェルループでやろうとしているようですが、そうする方が良いでしょう。それに夢中。以下ではawk
コマンドのみを使用します。
gawk 'ARGIND==2{ strings[$0]; next; };
(substr($0, 2, 5) in strings);
' RS='[[:space:]]+' strings.txt RS='\n' criteria.txt
ここではすべての文字列を読みます(\n
空白またはewlineに分割)。[[:space:]]
「文字列.txt」ファイルはawk
関連配列に保存されます(名前をとして指定しますstrings
)。
入力を制御ATGIND==2
し、最初のコードブロックのみを実行「文字列.txt」ファイルとアッ次の入力のためにブロックの実行をスキップします。ねえ私たちがより一般的な使用よりもこれを好む理由NR==FNR
。
次のファイルはいつですか?「標準.txt」処理のために開き、レコード区切り文字をデフォルトの\n
ewlineに設定して、期待どおりであることを確認しますRS='\n'
。(substr($0, 2, 5) in strings)
substr
イギリス場所から始まる2文字の長さは5配列に存在しますか?存在する場合、その行は出力に移動します。
入力データ
strings.txt
::
CDA01 CDA02
CDA03
CDA03 CDA05 CDA06
criteria.txt
:
xCDA01 something
xxCDA02 someotherthing
CDA01
vcCDA03 oCDA03
vCDA05 end
出力:
xCDA01 something
vCDA05 end