スクリプトでは、2つの変数ストリームをawkに入力として渡します。

スクリプトでは、2つの変数ストリームをawkに入力として渡します。

これは私の元のコマンドラインです。

awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' file1 file2

最初は、各セクションをファイルに出力してから、次の行でそのファイルを入力として使用するbashスクリプトにあります。しかし、今は変数の使用に切り替えており、この行に達し、二重入力のため中断されました。

だから私はもはやawkにファイルを供給しようとせずに変数を供給したいと思います。

変数を扱っている場合は、次のようにします。

echo "$var1" | awk '{$1=$2=""; print $0}'

しかし、bashスクリプトでawkに2番目の変数/ストリームを渡す方法の例はありません。

私が試したことの例:

awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$var1" "$var2"

echo "${var1}" | awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "${var2}"

awk -v s1="$var1" -v s2="$var2" 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$s1" "$s2"

編集する:

いくつかの背景では非常に単純化されたバージョンですが、次のファイルセットがあります。

:~/test$ ls -lR ?/file*
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 1/file.0
-rw-rw-r-- 1 madivad madivad  6 Apr 19 23:04 1/file.1
-rw-rw-r-- 1 madivad madivad  8 Apr 19 23:04 1/file.2
-rw-rw-r-- 1 madivad madivad  8 Apr 19 23:04 1/file.3
-rw-rw-r-- 1 madivad madivad  6 Apr 19 23:05 2/file.1
-rw-rw-r-- 1 madivad madivad 10 Apr 19 23:06 2/file.3
-rw-rw-r-- 1 madivad madivad  6 Apr 19 23:05 2/file.4
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 2/file.5

また、各ディレクトリ構造のハッシュ結果を含む2つの監査ファイルがあります。このファイルはかなり深く、それぞれ500 MBを超えるデータを含むことができます。

コマンドラインで、重複した項目、期間、サイズ、不足しているファイルなどを見つけるためのいくつかのツールを作成しました。プロセスをさらに自動化し、バッチファイルに含めようとしています。実際、すべてをバッチファイルに入れ、ハードドライブを準備場所として使用しました。つまり、各出力をファイルとしてハードドライブに保存し、次のバッチラインからそのファイルをロードして続行します。私の目標は、すべての重複ファイルを削除することです。

ファイル構造は標準hashdeep出力にありますが、固定ハッシュ文字列、いくつかのスペース、ファイルのフルパス、およびファイル名のみを含めるように操作しました。次のように始まります。

~/test$ head 2/audit?
==> 2/audit1 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/1
## $ hashdeep -l file.0 file.1 file.2 file.3
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.0
8,736e5da8b598eec84d4ec0e1be63b6d1,eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2,file.2
8,e487aeec573e0936c1ac9f091130c20b,1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f,file.3
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1

==> 2/audit2 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/2
## $ hashdeep -l file.1 file.3 file.4 file.5
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.5
6,9e87b0fde0cf6b641bd4a27aee5f5536,247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361,file.4
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1
10,b7b9e4419c0708f401d45f061ac9a231,fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52,file.3

処理を開始すると、awkすでに次のような結果が表示されます。

~/test$ head 2/so*
==> 2/sort1 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e    file.0
736e5da8b598eec84d4ec0e1be63b6d1eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2    file.2
e487aeec573e0936c1ac9f091130c20b1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f    file.3
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7    file.1

==> 2/sort2 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e    file.5
b7b9e4419c0708f401d45f061ac9a231fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52    file.3
9e87b0fde0cf6b641bd4a27aee5f5536247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361    file.4
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7    file.1

この質問に従って実行しようとしている特定の行の場合、ファイル$2名は両方のファイルに表示されますが、ハッシュ$ 1 `が一致しない場合にのみ上記の入力にa[$2] andファイル名を出力させたいと思います。

したがって、上記の入力については、次のように見えることが期待されます。

file.3

答え1

次の変数を考えてみましょう。

$ a=$'one\ntwo';echo "$a"
one
two
$ b=$'three\nfour';echo "$b"
three
four

可能なオプションは次のとおりです。

$ printf '%s\n%s\n' "$a" "$b" |awk '{print NR,$0}'
$ awk '{print NR,$0}' <(echo "$a") <(echo "$b")   #process substitution as per Kusalananda's comment
$ echo "$a" |awk '{print NR,$0}' - <(echo "$b")
$ { echo "$a" && echo "$b";} |awk '{print NR,$0}'  #or even { echo "$a";echo "$b";}
$ awk '{print NR,$0}' <(echo "$a";echo "$b")
$ awk '{print NR,$0}' <<<$(echo "$a";echo "$b")

上記のすべての例の結果は次のとおりです。

1 one
2 two
3 three
4 four

変数が新しい行で終わる場合(つまり、変数にファイルの内容が含まれている場合)。

$ a=$'one\ntwo\n'
$ b=$'three\nfour\n'

これでこれも機能します。

$ awk '{print NR,$0}' <<<"$a$b"
1 one
2 two
3 three
4 four
5 

関連情報