두 파일에서 정보를 수집한 다음 이를 다른 파일로 정렬하는 스크립트를 만들어야 합니다. 터미널에서 실행

두 파일에서 정보를 수집한 다음 이를 다른 파일로 정렬하는 스크립트를 만들어야 합니다. 터미널에서 실행

두 개의 파일이 있고 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의 file 에 대해 OP data1's file 을 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필요에 따라 정렬됩니다. <절차적 대체에서는 여는 괄호와 닫는 괄호 사이에 공백이 있을 수 없습니다 .(
  • 조인 결과는 첫 번째 열을 기준으로 정렬되지만 숫자로는 정렬되지 않습니다. 또한 두 번째와 네 번째 위치에는 각 사람의 이름이 반복됩니다.
  • 위의 결과를 간단한 awkcmd에 파이프하고 레코드 필드 5의 숫자가 레코드 필드 3자리의 숫자보다 큰지 또는 그 반대인지에 따라 조건부로 필드 1,2,3,5 또는 1,2,5,3을 인쇄합니다.

화타이

관련 정보