両方のファイルから情報を収集し、それを別のファイルにソートするスクリプトを作成する必要があります。端末で実行

両方のファイルから情報を収集し、それを別のファイルにソートするスクリプトを作成する必要があります。端末で実行

2つのファイルがあり、kolokwium1.txt名前kolokwium2.txtと数字が含まれています。

コロクウィウム1.txt

Kowalski Jan 3
Nowak Adam 5
Malec Ewa 2 

コロクウム2.txt

Malec Ewa 4
Kowalski Jan 2
Nowak Adam 3

からファイルを生成するscalenie.shスクリプトを作成したいと思います。kolokwia.txtkolokwium1.txtkolokwium2.txt

新しいファイルでは、名前と数字が低いものから高いものの順にソートされます。

kolokvia.txt

Kowalski Jan 2 3
Nowak Adam 3 5
Malec Ewa 2 4

答え1

与えられた

$ head kolokwium{1,2}.txt
==> kolokwium1.txt <==
Kowalski Jan 3
Nowak Adam 5
Malec Ewa 2

==> kolokwium2.txt <==
Malec Ewa 4
Kowalski Jan 2
Nowak Adam 3

その後、使用ミラー

mlr --nidx sort -f 1,2 -n 3 then \
  nest --implode --values --across-records --nested-fs ' ' -f 3 kolokwium{1,2}.txt > kolokwia.txt

生産する

$ cat kolokwia.txt 
Kowalski Jan 2 3
Malec Ewa 2 4
Nowak Adam 3 5

答え2

出力ではなく、OPのファイルにOPdata1のファイルをkolokwium1.txt使用しています。data2kolokwium2.txtdatakolokwia.txt

これを行う方法はいくつかあります。一部は純粋にawk

join以下は、最初の列に基づいて、次を使用して数値を選択的に印刷して整列させる(非常に?)簡単なソリューションですawk

$ join -j 1  -t" " <(sort data1) <(sort data2) | awk '$5>$3 {print $1, $2, $3, $5} $3>$5 {print $1, $2, $5, $3}' >| data
$ cat data
Kowalski Jan 2 3
Malec Ewa 2 4
Nowak Adam 3 5

説明する:

  • joinオプション-j 1:両方の入力ファイルの列1をリンクします。
  • joinオプション-ティー"":入力フィールドと出力フィールドの区切り文字として ""(スペース)を使用します。
  • 表記法は<(sort filename)手続き型置換と呼ばれます。ここでは、ファイル名を使用してソートプロセスの出力を参照できます。どちらの入力ファイルもjoin必要に応じてソートされます。<手続き型置換では、開かっこと閉じ括弧の間にスペースを含めることはできません。(
  • 結合結果は最初の列に基づいてソートされますが、数値ではソートされません。また、2番目と4番目の位置では、各人の名前が繰り返されます。
  • 上記の結果を単純なawkcmdにパイプし、レコードフィールド5の数字がレコードフィールドの3桁の数字より大きいかその逆であるかによって、条件付きでフィールド1、2、3、5、または1,2,5,3を印刷します。

ファタイ

関連情報