web-dev-qa-db-ja.com

2つのファイルの最初の列を比較し、文字列が一致する場合は「true」を出力する方法

File1とfile2の2つのファイルがあります。

file1:

91 | 2018-10-11 16:07:14 | bkwdv | 188.0000 |
77 | 2018-10-12 15:05:15 | wvwef | 94.0000  | 

file2:

77 | 2018-10-12 15:05:15 | wvwef | 94.0000  
91 | 2018-10-11 16:07:14 | bkwdv | 188.0000 

File1の最初の列とfile2の最初の列を比較したいと思います。

文字列が一致する場合(指定された入力データのように順序に関係なく)、「成功」を出力する必要があります。それ以外の場合は「終了」を出力します。したがって、指定された入力データに従って、「成功」を出力する必要があります。

最初の列の行数はどちらのファイルでも異なる可能性があるため、この場合は終了する必要があることに注意してください。

2
User123

あなたの質問に対する私の答えと同様 ここ

#!/bin/bash
var=$(cut -d"|" -f 1 file  | sort -k1.1n)
var1=$(cut -d"|" -f 1 file | sort -k1.1n)

if [ "$var" == "$var1" ]
then
  echo "success"
else
  exit
fi

説明????:

コマンドcutの区切り文字-d|-d |で設定されているため、cut|である列間の境界を確認できます。次に、cutは、-fフラグを使用して列#1の対象フィールドを引き出すことができます。

この例では、コマンドsortで、データの限定されたサブセット(つまり、列#1のデータ)を比較する必要があります。そのため、-kオプションと呼ばれるキーを使用して比較するフィールドを指定しました。 k1.1は最初のフィールドをソートし、残りの列を無視します。つまり、列#1から列#1に並べ替えます(つまり、列#1のみを並べ替えます)。

sort man によると

-k, --key=POS1[,POS2]   Where POS1 is the starting field position, and POS2 is the ending field position
3
user88036

各ファイルから列1を抽出し、数値で並べ替えて、比較します。

awk '{ print $1 }' <file1 | sort -n >file1.col1
awk '{ print $1 }' <file2 | sort -n >file2.col1

if cmp -s file1.col1 file2.col1; then
    echo 'success'
else
    echo 'exit'
fi

rm file1.col1 file2.col1

または、bash固有の構文を使用します。

if cmp -s <( awk '{ print $1 }' <file1 | sort -n ) \
          <( awk '{ print $1 }' <file2 | sort -n )
then
    echo 'success'
else
    echo 'exit'
fi

cmp -sコマンドは何も出力しませんが、2つのファイルオペランドの内容が同じである場合は正常に終了します。これをifステートメントで使用して、2つのファイルのソートされた最初の列が同一であるかどうかを判断します。

上記のコードのawk '{ print $1 }'は、最初の列の数字の後の空白文字がスペース文字の場合、cut -d ' ' -f 1に置き換えることもできます。

4
Kusalananda

joinを使用して、ソートされたファイル内のペアにできない行をチェックし、結果が空の文字列であるかどうかをテストできます。

[[ -z "$(join -t '|' -v1 -v2 <(sort file1) <(sort file2))" ]] && echo "success" || echo "exit"
2
steeldriver

よくそのような条件で

  1. 猫の両方のファイル
  2. sort -n uniqe
  3. 結果行の数を数える

両方のファイルの行数としてsam番号を取得した場合、成功します。

N1=$(cat file1 |wc -l) ;N2=$(cat file2 |wc -l); N3=$(cat file1 file2 |sort -nu |wc -l); echo $N1 $N2 $N3

結果を取得する必要がある場合:成功/終了、N1、N2、N3を自分で比較する必要があります。もちろん、結果N3の取得を開始する前に、N1とN2を比較することをお勧めします。等しい場合は、N1とN3のみを比較します(N3のカウントを開始するため、N1 == N2) 。

0
schweik