2つのファイルの最初の列を比較し、文字列が一致した場合に「true」を印刷する方法[重複]

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の最初の列を比較したいと思います。

文字列が一致した場合(入力データに応じて順序に関係なく)、「成功」を印刷し、そうでない場合は「終了」を印刷する必要があります。したがって、与えられた入力データに基づいて「成功」を印刷する必要があります。

最初の列の行数は両方のファイルで異なる可能性があるため、この場合は終了する必要があります。

答え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つのファイルオペランドの内容が同じ場合は正常に終了します。if2つのファイルの最初に並べ替えられた列が同じであることを確認するために、ステートメントでそれを使用します。

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

答え2

あなたの質問に対する私の答えに似ていますここ

#!/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

説明する

答え3

スキャンを使用して、ファイルでペアリングできない行を並べ替え、join結果が空の文字列であるかどうかをテストできます。

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

答え4

だからそのような条件で

  1. 猫2つのファイル
  2. ソートN固有
  3. 結果の行数を計算します。

両方のファイルの行数と同じ数を取得すると成功しました。

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になります)。

関連情報