열을 기준으로 행에 제목 추가

열을 기준으로 행에 제목 추가

나는 다음과 같은 입력을 가지고 있습니다

a b danny
c d joe
1 4 danny
d 5 dana
e f joe
t 4 dana

마지막 열을 기준으로 정렬하여 각 행 집합에 헤더로 추가하고 싶습니다. Linux에서는 다음과 같이 출력됩니다(그룹 순서는 중요하지 않음).

dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny
joe
c d joe
e f joe

(e)grep/sed/awk 및 기타 명령줄 도구를 사용하여 수행할 수 있습니까?

답변1

GNU coreutils sort및 다음을 사용하십시오 awk.

$ sort -sk3 file | awk '$3!=group{ group=$3; print group }1'
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny
joe
c d joe
e f joe

-k3stable( ) sorting 을 사용하여 세 번째 필드( )에서 입력 파일을 정렬한 -s다음 출력을 awk세 번째 필드로 파이프하고 변경 사항이 없으면 세 번째 필드를 자체 줄에 인쇄합니다. 그런 다음 현재 레코드( 1)를 인쇄합니다.

답변2

출력 순서는 중요하지 않다고 명시했으므로 마지막 필드의 값으로 키가 지정된 레코드의 연관 배열을 만든 다음 마지막에 키와 값을 인쇄할 수 있습니다.

awk '
  {a[$NF] = a[$NF] (a[$NF] ? ORS : "") $0} 
  END {for (i in a){print i; print a[i]}}
' file
joe
c d joe
e f joe
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny

또는 값을 처음 볼 때 값 앞에 키를 추가하세요.

awk '
  {a[$NF] = (($NF in a) ? a[$NF] : $NF) ORS $0} 
  END {for (i in a) print a[i]}
' file
joe
c d joe
e f joe
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny

만약 너라면하다그룹을 정렬하고 GNU awk > 4.0을 사용하려면 다음 구조를 사용하여 달성할 수 있습니다 PROCINFO[].

gawk '
  {a[$NF] = (($NF in a) ? a[$NF] : $NF) ORS $0}
  END {PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in a) print a[i]}
' file
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny
joe
c d joe
e f joe

관련 정보