여러 파일 정렬 및 병합

여러 파일 정렬 및 병합

여러 텍스트 파일을 역순으로 정렬한 다음 병합/캣을 하나의 텍스트 파일로 만들고 싶습니다.

a.txt

0   33.1
2   33.0
10  21.1
20  21.8

b.txt

0   30.1
2   33.0
10  28.1
20  27.8

*.txt파일을 기다리는 중

나는 이런 출력을 원한다

20  21.8
10  21.1
2   33.0
0   33.1
20  27.8
10  28.1
2   33.0
0   30.1

나 이거 싫어해

20  21.8
20  27.8
10  21.1
10  28.1
2   33.0
2   33.0
0   33.1
0   30.1

나는이 코드를 시도했다

for file in *.txt ; do 
   sort -nrk 1,1 *.txt > "$file" ; 
done

나도 시도했다

sort -m *.txt

하지만 이 코드의 출력은 내가 원하는 것이 아닙니다.

sort merge paste cat다른 관련 옵션을 사용하여 솔루션을 찾고 있습니다 .

도움을 주셔서 감사합니다.

답변1

파일을 개별적으로 정렬하고 전체 출력을 결과 파일로 리디렉션합니다.

for file in *.txt ; do 
   sort -k1,1rn < "$file"
done > file.concatenated

.txt(여기서 중요한 점은 출력 파일이 리디렉션을 통해 먼저 생성되므로 확장자가 없다는 것입니다 .)

또는 파일을 그 자리에서 정렬하려는 경우(자체 정렬하려면 재정의):

set -- *.txt
ok=true
for file do
  sort -o "$file" -k1,1rn -- "$file" || ok=false
done
"$ok" && cat -- "$@" > file.concatenated

이 2단계 접근 방식을 사용하면 연결된 파일을 생성하기 전에 파일 순서 문제를 감지할 수 있습니다.

.txt루프를 통과할 때마다 전체 파일 목록을 전달하기 때문에 첫 번째 루프가 작동하지 않습니다 .

sort -m이미 정렬된 파일을 정렬된 출력으로 병합합니다. 이것은 당신이 원하는 것과 반대입니다. 아직 정렬되지 않은 파일을 정렬하고 정렬된 출력에 병합하지 않고 결과만 연결하려고 합니다.

여기에서는 파일이 정방향으로 정렬된 것처럼 보입니다. 이것이 항상 사실이라고 믿을 수 있다면 이를 뒤집을 수 있어야 하며 이는 정렬을 뒤집는 것보다 더 효율적입니다.

GNU 시스템에는 이를 위한 tac명령과 기타 여러 가지 명령이 있습니다 tail -r(그러나 일부 구현에서는 파일 인수만 사용하므로 이를 사용하여 반복해야 할 수도 있습니다).

tac -- *.txt > file.concatenated

또한 이는 -k1,1rn관계를 해결할 때와 동일하지 않습니다. -rnk1,1두 줄이 같은지 비교할 때 sort전체 줄은 어휘적으로 비교됩니다(여기와 같이 와 같은지 비교되지만 1 a이전 에는 어휘적 으로 비교됨 ).1 b-k1,1n1 a1 b

-r옵션을 사용하면 최종 비교가 역순으로 수행됩니다. 이는 r주요 사양 중 하나에 플래그를 추가하는 경우에는 적용되지 않습니다.

GNU는 동일하게 비교된 줄의 원래 순서를 유지하도록 최종 비교를 비활성화 sort해야 합니다 .-s

관련 정보