2つのファイルがあります。
c1 ログ
D1W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff
c2ログ
E1W /u02/app/oracle/db/ggs/current/dirdat/fe
E2W /u02/app/oracle/db/ggs/current/dirdat/fe
E3W /u02/app/oracle/db/ggs/current/dirdat/fe
F1W /u02/app/oracle/db/ggs/current/dirdat/ff
F2W /u02/app/oracle/db/ggs/current/dirdat/ff
F3W /u02/app/oracle/db/ggs/current/dirdat/ff
F4W /u02/app/oracle/db/ggs/current/dirdat/ff
c1.logの各行の2番目の列とc2.logの各行の2番目の列を比較する必要があります。一致する場合は、出力を1行で印刷する必要があります。
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
また、出力は新しいファイルに書き込む必要があります。 c3.logを想定してください。
ありがとう、モーセ
答え1
私はこれを行う単純なPythonスクリプトを書いた。
address1 = input("Enter first file address:\n")
address2 = input("Enter second file address:\n")
data1 = []
data2 = []
with open(address1) as file:
data1 = file.read().split('\n')
with open(address2) as file:
data2 = file.read().split('\n')
if data1[-1] == "": data1.pop()
if data2[-1] == "": data2.pop()
for i in data1:
for j in data2:
if i.split(' ')[1].strip() == j.split(' ')[1].strip():
print(i + ' ' + j)
答え2
join
あなたのためにほとんどの作業を行うことができます。次のように、2 番目のフィールドで一致する 2 つのファイルの一致する行を連結します。
$ join -j 2 c1.log c2.log
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E1W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E2W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F1W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F2W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F4W
これにより、一致と c1 と c2 の最初の列が表示されます。結合するには、入力ファイルをソートする必要があります。そうでない場合は、すぐに並べ替えることができます
join -j2 <(sort c1.log) <(sort c2.log)
。これはシェル魔法です。<( some command )
ファイルjoin
やファイルが必要な他のコマンドのように見えます。
これをさらに処理してみましょう。
$ join -j 2 c1.log c2.log | while read match c1 c2; do printf '%s %s\t%s %s\n' $c1 $match $c2 $match; done
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff
完璧!
以下は、必要に応じてスクリプトに貼り付けることができるように慎重にラップされたコマンドです。
join -j 2 c1.log c2.log \
| while read match c1 c2; do
printf '%s %s\t%s %s\n' "$c1" "$match" "$c2" "$match"
done
2つの部分の間にラベルが必要ない場合@bu5hmanがより良い答えを持っています。
修正する:
結合を使用してタブ文字を挿入することもできます。
join -t' ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log)
次のスペースは-t'
リテラルタブ文字です。 Ctrl+V を押して Tab キーを押します。また、ファイルをインラインでソートしています。
$ join -t' ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log)
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F4W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff
答え3
または、ファイルがソートされていると仮定します。-k2
join -j2 -o 1.1 1.2 2.1 2.2 c1.log c2.log
出力:
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff
答え4
これは、c1.log、c2.log、および次のスクリプトが同じディレクトリにあると仮定して機能します。
while read i
do
c1_array=( $i )
string1=${c1_array[1]}
while read j
do
c2_array=( $j )
string2=${c2_array[1]}
if [ $string1 = $string2 ]
then
echo "$i $j"
fi
done < c2.log
done < c1.log