Bash 한 줄 코드 또는 스크립트를 사용하여 파일의 테이블 내용을 구문 분석합니다.

Bash 한 줄 코드 또는 스크립트를 사용하여 파일의 테이블 내용을 구문 분석합니다.

나는 한동안 Linux 명령을 사용하여 로그 파일(아래에 붙여넣은 형식)을 정렬하는 방법을 알아내려고 노력했지만 제대로 작동하지 않습니다. 이 파일의 설정은 다음과 같습니다.

columnA | colB | colC | colD  
name_1| data | 1   | data
name_1| data | 2   | data
name_1| data | 3   | data
name_2| data | 1   | data
name_2| data | 2   | data

C 열의 가장 높은 값과 가장 높은 값을 가진 행의 colC에 있는 다른 열의 해당 데이터를 기반으로 A 열의 각 이름에 대해 하나의 항목만 포함하는 파일을 갖고 싶습니다.

누군가 명령이나 파이프라인을 알고 있다면 크게 감사하겠습니다.

감사해요

답변1

$ awk -F'|' '
  NR==1 { header=$0 };
  NR>1 && ($3 > colC[$1]) { colC[$1] = $3 ; line[$1] = $0};

  END {
    print header;
    for (i in line) { print line[i] }
  }' file.log 
columnA | colB | colC | colD
name_1| data | 3   | data
name_2| data | 2   | data

이 스크립트는 |필드 구분 기호를 사용하여 awk변수의 첫 번째 행을 저장 한 header다음 배열을 사용하여 colCA 열( $1)의 각 값과 C 열에 표시된 가장 높은 값($3)을 저장합니다. 이 배열은 line일치하는 전체 입력 행( $0)을 저장하는 데에도 사용됩니다.

마지막으로 모든 입력을 읽고 처리하면 저장된 각 줄을 인쇄합니다. 연관 배열은 지정된 순서로 저장되지 않기 때문에 출력을 정렬해야 할 수 있습니다 sort. 출력을 로 파이프하십시오. 입력 파일에 따라 헤더 행이 출력의 중간 또는 끝으로 정렬될 수 있습니다. 그런 경우에는 스크립트에 저장하거나 인쇄하는 것이 아니라 awk스크립트에 인쇄하는 것이 좋습니다. awk 스크립트를 실행하는 쉘 스크립트입니다.

노트:이 알고리즘을 최적화하는 방법에는 여러 가지가 있습니다. 저는 가독성과 단순성을 위해 최적화하는 방법을 선택했습니다. 입력 파일 길이가 수백만 또는 수십억 줄이 아닌 이상 성능 및 메모리 소비는 최적화할 가치가 있는 문제가 아닐 것입니다.

관련 정보