我需要制作一个脚本,从两个文件中收集信息,然后将其排序到另一个文件中。从终端启动

我需要制作一个脚本,从两个文件中收集信息,然后将其排序到另一个文件中。从终端启动

我们有两个文件kolokwium1.txtkolokwium2.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.txtkolokwium2.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

我使用data1OP's file kolokwium1.txtdata2用于 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需要进行排序。请注意,过程替换中的<左括号和左括号之间不能有空格。(
  • 连接的结果按第一列排序,但不按数字排序。此外,每个人的名字在第二和第四位置重复。
  • 将上述结果通过管道传输到一个简单的awkcmd 中,并有条件地打印字段 1,2,3,5 或 1,2,5,3,具体取决于记录字段 5 中的数字是否大于记录字段 3 中的数字,反之亦然。

华泰

相关内容