我们有两个文件kolokwium1.txt
和kolokwium2.txt
,它们包含名称和号码。
kolokwium1.txt
Kowalski Jan 3
Nowak Adam 5
Malec Ewa 2
kolokwium2.txt
Malec Ewa 4
Kowalski Jan 2
Nowak Adam 3
我想编写一个脚本scalenie.sh
来创建一个kolokwia.txt
从文件kolokwium1.txt
和kolokwium2.txt
.
在新文件中,此处将按从最低到最高的顺序对名称和数字进行排序:例如。
科洛克维亚.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
我使用data1
OP's file kolokwium1.txt
,data2
用于 OP's file 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
选项-t“”:使用“”(空格)作为输入和输出字段分隔符- 表示法
<(sort filename)
称为过程替换。这里可以使用文件名来引用排序过程的输出。两个输入文件都根据join
需要进行排序。请注意,过程替换中的<
左括号和左括号之间不能有空格。(
- 连接的结果按第一列排序,但不按数字排序。此外,每个人的名字在第二和第四位置重复。
- 将上述结果通过管道传输到一个简单的
awk
cmd 中,并有条件地打印字段 1,2,3,5 或 1,2,5,3,具体取决于记录字段 5 中的数字是否大于记录字段 3 中的数字,反之亦然。
华泰