여러 파일에서 이름을 알파벳순으로 추출하는 방법

여러 파일에서 이름을 알파벳순으로 추출하는 방법

내가 가지고 있다고 말해

파일 1:

Aaron
Vernon
Troy
Roy

파일 2:

Jason
Derek
Mariano
Alex

표시하고 싶은 내용:

File1: Aaron
File2: Alex

이 두 가지를 모두 수행할 수 있는 한 줄의 bash 명령은 무엇입니까?

sort를 사용한 다음 tail -1을 사용할 생각인데 이번에는 1개의 파일에서만 추출할 수 있습니다.

답변1

배열 정렬 기능이 내장된 GNU awk를 사용하면 다음을 asort수행할 수 있습니다.

gawk '
  BEGINFILE{delete a}; 
  {a[FNR]=$0}; 
  ENDFILE{asort(a); print FILENAME": "a[1];}
' File1 File2
File1: Aaron
File2: Alex

원하시면 한줄로 작성하셔도 됩니다

gawk 'BEGINFILE{delete a}; {a[FNR]=$0}; ENDFILE{asort(a); print FILENAME": "a[1];}' File1 File2

답변2

for f in File* ; do
  printf "%s: %s\n" "$f" $(sort "$f" | head -n 1)
done

산출:

File1: Aaron
File2: Alex

답변3

이것은 당신의 목표를 달성하는 것 같습니다.

grep . File1 File2|sort -k 2,2 -t:|sed 's/:/: /g'
File1: Aaron
File2: Alex
File2: Derek
File2: Jason
File2: Mariano
File1: Roy
File1: Troy
File1: Vernon

답변4

원래 질문(파일당 한 줄, 현재 "필요"라고 말하는 대로 모든 줄이 정렬되지는 않음), 파일이 큰 경우(특히 메모리보다 큰 경우), 그리고 고대 GNU awk가 아닌 경우(큰 대부분의 Linux 및 일부 )이 있는 다른 bash시스템:

[g]awk -vx= 'FNR==1||$0<x {x=$0""} ENDFILE {print FILENAME": "x}' file1 file2 ...

GNU가 아닌 awk(또는 고대 gawk)를 사용하여 이 작업을 수행할 수 있지만 약간 투박합니다.

[*]awk -vx= 'FNR==1&&NR!=1 {print f": "x} FNR==1||$0<x {f=FILENAME;x=$0""} END {if(NR) print f": "x}' file1 file2 ...

관련 정보