説明する

説明する

たとえば、次のようなファイルがあります。

B01 112178282 A01 112178282
A05 44887670 A01 44887670
B01 114451441 A01 114451441
B10 8364597 A01 8364597
B01 123453906 A01 123453906
A05 9155966 A01 9155966
A05 86420950 A01 86420950
A10 75684694 A01 75684694
A04 71261964 A01 71261964
B01 1262441 A01 1262441
B01 471272 A01 471272
B01 17007 A01 17007
A04 115637044 A01 115637044
A07 9376758 A01 9376758

2つの別々の出力ファイルが欲しい

  1. いつnum val in col1 == num val in col3
  2. 2番目の出力ファイルは次のようにする必要があります。num val in col 1 != num val in col 3

たとえば、col1はB01、col3はA01です。ここで、2つの列の数字の部分は同じです01。これで、これらすべての条件をfile1にリストする必要があります。

col1 が A05、col3 が A01、2 列の数値部分が異なる07 != 01場合は、別のファイルにリストする必要があります2

答え1

awk 'substr($1,2)==substr($3,2) { print $0 > "file1" } substr($1,2) != substr($3,2) { print $0 > "file2" }' masterfile

生データを含むマスターファイルを使用し、awkのsubstr関数を使用してフィールドの最初の文字を区切る最初と3番目のスペースを無視し、比較する数字だけを残します。次に、この数字に対して条件付きチェックを実行し、それに応じて特定のファイル(ファイル1とファイル2)に配置します。

答え2

を使用すると、2つのファイルが生成されます。awk1 と 3 の数値部分同じ行は別々のファイルに移動し、その列が異なる行は別のファイルに移動します。

awk -F"[A B]" '{
    print >(($2==$5)?"matches.txt":"non_matches.txt")
}' infile.txt

これにより、awkのフィールド区切り文字が空白文字セットに設定され、比較され、数値部分が等しい場合は現在のABが「matches.txt」ファイルに書き込まれ、それ以外の場合は「non_matches.txt」ファイルに書き込まれます。 txt"ファイルです。

答え3

perl -alMFatal=open -pe '
   BEGIN{ unlink, open *{+uc}, ">>$_" for qw/file1.log file2.log/; }
   select $F[0] =~ s/^\D*//r eq $F[2] =~ s/^\D*//r ? *{"FILE1.LOG"} : *{"FILE2.LOG"};
' sample.txt

説明する

  • Perlオプション:
    • -a行は、スペースに基づいて渡す​​ことができるフィールドに分割されます。$F[0] $F[1] ...
    • -lRS改行と改行に設定されますORS
    • -Mモジュールがロードされ、その名前空間の関数が含まれますFatal.pmopenこれは、メインコードでファイルを開くときに発生したすべてのエラーが消えることを意味します。
    • -pSample.txt ファイルは 1 行ずつ読み取られ、すべての変換が適用された後に自動行印刷が有効になります。
  • このBEGINブロックは既存のfile1.logとfile2.logを削除し、appendファイルモードでファイルハンドルを開く必要があります。
  • selectコマンドは、現在の行を印刷するファイルハンドルを選択します。
    • $F[0] =~ s/^\D*//r最初のフィールドでは、数字以外の先行文字はすべて削除する必要があります(すべての数字がフィールドの末尾に配置されていると仮定)。
    • 3番目のフィールド($ F [2])でも同様の操作を実行し、結果を文字列形式(数値では001 = 1なので数値ではなく)と比較します。文字列が一致したら、ファイルハンドル* FILE1.LOGを選択します。これは-p、対応するオプションによって現在の行がここに印刷されることを意味します。 OTWでは、ファイル・ハンドル* FILE2.LOGがデフォルト・ハンドルに設定され、-pオプションを使用すると、Perl現在の行がそこに印刷されます。

sed表示されているものと同じツールを使用して同じことを実行できます。 (GNU sedを想定)

sed -Ee '
   h;s/\S+/\n&\n/3
   /^[^0-9[:blank:]]*([0-9]+).*\n(.*[^0-9])?\1\n/{
      g
      s/^//w file1.log
      d
   }
   g
' < sample.txt > file2.log

  • 最初のステップでは、3番目のフィールドをタグで囲みます。
  • 次に、最初のフィールドの末尾の数字を比較して、3番目のフィールドの末尾の数字と一致します。
  • 一致する場合は、現在の行(トークンなし)を格納する予約済みスペースを呼び出し、それをfile1.logファイルに追加します。
  • 一致するものがない場合は、予約スペースを呼び出してそれをstdoutに送信し、ここでシェルによってfile2.logファイルに保存されます。

答え4

sed編集スクリプトでGNUを使用します(sed最初の行でシステムに合わせてGNUのパスと名前を変更します)。

#!/usr/bin/sed -nrf

/^[A-Z]([0-9]+) [0-9]+ [A-Z]\1 [0-9]+$/{
    w match.txt
    b
}
w nonmatch.txt

サンプルファイルでこのコマンドを実行すると、2つの結果ファイルmatch.txtと次のものが生成されますnonmatch.txt

$ chmod +x script.sed

$ ./script.sed file.in

$ cat match.txt
B01 112178282 A01 112178282
B01 114451441 A01 114451441
B01 123453906 A01 123453906
B01 1262441 A01 1262441
B01 471272 A01 471272
B01 17007 A01 17007

$ cat nonmatch.txt
A05 44887670 A01 44887670
B10 8364597 A01 8364597
A05 9155966 A01 9155966
A05 86420950 A01 86420950
A10 75684694 A01 75684694
A04 71261964 A01 71261964
A04 115637044 A01 115637044
A07 9376758 A01 9376758

このスクリプトは、デフォルトで各行の特定の正規表現を一致させようとします。列1と列3の2つの数字が等しい場合、式は一致します(ここでは逆参照を使用してsedBSDがこのスクリプトを実行することはできません)。

2 つの数字が等しい場合、対応する行が作成され、match.txtスクリプトは最初に分岐し、次の入力行に進みます。

行が正規表現と一致しない場合は記録されますnonmatch.txt

関連情報