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.txt
kolokwium1.txt
kolokwium2.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
使用しています。data2
kolokwium2.txt
data
kolokwia.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番目の位置では、各人の名前が繰り返されます。
- 上記の結果を単純な
awk
cmdにパイプし、レコードフィールド5の数字がレコードフィールドの3桁の数字より大きいかその逆であるかによって、条件付きでフィールド1、2、3、5、または1,2,5,3を印刷します。
ファタイ