
file2 file1.txtの値ではなく、変数に保存された値を送信することは可能ですか?上記のクエリで変数を渡す方法を教えてください。クエリに変数を渡そうとしましたが、変数は値を単一の行として保存し、目的の出力を取得できませんでした。
ご回答ありがとうございます。上記のfile1とfile2の値がコマンド出力であり、それを変数に格納していますが、このクエリでこれらの変数を渡す方法を知りたいです。これがはっきりしていることを願っています。
[p001 ~]$ cat file1
30042020
29042020
28042020
27042020
26042020
25042020
24042020
[p001 ~]$ cat file2
303 30042020
259 29042020
288 28042020
402 27042020
75 26042020
207 25042020
[p9147724_local@dotenprlpbas001 ~]$ var1=$(cat file1)
[p9147724_local@dotenprlpbas001 ~]$ var2=$(cat file2)
[p001 ~]$ awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' "$var2" "$var1"
awk: fatal: cannot open file `303 30042020 259 29042020 288 28042020 402 27042020 75 26042020 207 25042020' for reading (No such file or directory)
予想出力:
30042020 303
29042020 259
28042020 288
27042020 402
26042020 75
25042020 207
24042020 0
答え1
a[$1] = $2
次のように変更するだけですa[$2] = $1
。
awk 'NR == FNR{ a[$2] = $1; next }; { print $1, $1 in a?a[$1]: "0" }' file2 file1
ただし、これは次のように短縮できます。
awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' file2 file1
修正する:コマンド出力から入力を読み込みます。CommandX&コマンドY。
awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' <(cmdY) <(cmdX)
もし使用中のシェルはプロセスの交換をサポートしていません:次のことができます。
( cmdY | ( cmdX | (
awk '
NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }
' /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
答え2
このjoin
ユーティリティはヒット項目を一致させることができますが、欠落項目を一致させるには2番目のパスとprintf
書式設定が必要で、以下を印刷します0
。
join -2 2 file{1,2} ; printf '%s 0\n' $(join -v 1 -2 2 file{1,2})
注:join
両方のファイルが同じ順序で並べ替えることを期待しています。