동일한 헤더를 공유하는 파일을 그룹화한 다음 연결합니다.

동일한 헤더를 공유하는 파일을 그룹화한 다음 연결합니다.

Ubuntu에서 Bash를 사용하고 있으며 질문은 다음과 같습니다.

.TXT특정 폴더에 수십 개의 파일이 있습니다.

내가 아는 한, 그들은 모두 제목을 가지고 있습니다. (각 제목이 한 줄에 있다고 생각하지만 100% 확실하지는 않습니다.) 그러나 동일한 헤더를 공유할 필요는 없습니다. 5개의 파일에는 동일한 헤더가 있을 수 있고 다른 파일에는 고유한 헤더가 있을 수 있습니다.

궁극적으로 내가 원하는 것은 동일한 헤더를 공유하는 파일을 연결하는 것입니다. 다음 질문에 대한 답변(동일한 헤더로 여러 파일 연결)은 동일한 헤더를 가진 여러 파일을 연결하는 방법을 설명하지만 제 경우에는 먼저 동일한 헤더를 공유하는 파일을 연결하기 전에 그룹화해야 했습니다(그리고 해당 그룹 헤드에 첫 번째 파일의 헤더만 유지해야 했습니다).

어떤 아이디어라도 환영합니다 :) 감사합니다!

답변1

awk '
  FNR==1{
    if (!($0 in h)){file=h[$0]=i++}
    else{file=h[$0];next}
  }
  {print >> (file)}
' *.txt

awk가 파일의 첫 번째 줄에 있는 경우:

  • 헤더 배열에 헤더가 없으면 h숫자(초기 0)가 파일 이름으로 설정되고 i++배열의 키에 배치됩니다.$0
  • 그렇지 않은 경우(헤더가 이미 배열에 있는 경우 h) 배열에서 파일 이름을 가져오고 다음 줄을 읽습니다.

마지막으로 해당 행이 해당 파일에 인쇄됩니다.


하지만 "열린 파일이 너무 많습니다." 또는 이와 유사한 메시지가 나타납니다.

GNU awk는 이를 방지하기 위해 요청 시 파일 열기 및 닫기를 처리하지만 다른 awk에서는 이를 수행하지 않을 수 있습니다. 이 경우 다음으로 이동하십시오.

awk '
  FNR==1{
    if (!($0 in h)||file!=h[$0]){close(file)}
    if (!($0 in h)){file=h[$0]=i++}
    else{file=h[$0];next}
  }
  {print >> (file)}
' *.txt

속도가 느려질 수 있다는 점을 명심하세요.

관련 정보