세 개의 행을 하나로 결합하는 방법

세 개의 행을 하나로 결합하는 방법

최대 2000줄의 다음 패턴을 포함하는 파일이 있습니다. 패턴은 3줄의 각 세트마다 서로 다른 숫자값으로 반복되지만 시작 텍스트 값은 파일 끝까지 공통됩니다.

여기서는 세 줄을 병합해야 합니다.

다음과 같이 입력하세요

ABC 1223334
Days 344678544324677
Base 45666
ABC 1234565
Days 234567899765443
Base 456643

다음과 같은 출력이 필요합니다.

ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

답변1

이는 입력이 Unix 텍스트 형식이라고 가정합니다. DOS/Windows 텍스트 형식 파일을 사용하는 경우 먼저 dos2unix다음을 사용하십시오.

탭으로 구분된 출력의 경우:

$ paste - - - <file
ABC 1223334     Days 344678544324677    Base 45666
ABC 1234565     Days 234567899765443    Base 456643

공백으로 구분된 출력의 경우:

$ paste -d ' ' - - - <file
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

위에 표시된 대로 3개의 대시와 함께 이 paste명령을 사용하면 3개의 출력 열이 생성되며, 여기서 각 열은 입력의 행에서 읽혀집니다. 기본적으로 열은 탭이나 옵션 인수로 사용되는 문자로 구분됩니다 -d.

답변2

이렇게 사용하세요:

awk '{if (NR % 3 == 0) {print}else{printf "%s ", $0}}' file
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

답변3

모든 레코드에 3개의 행이 있다고 가정하는 대신 첫 번째 필드가 첫 번째 레코드의 첫 번째 필드와 일치할 때 이전 레코드가 가득 찼음을 확인할 수 있습니다.

awk '
  {
    if (NR == 1)
      first = $1 ""
    else if ($1 == first)
      sep = ORS
    else
      sep = OFS
    printf "%s", sep $0
  }
  END {if (NR) printf "%s", ORS}'

답변4

간단한 쉘 루프를 사용하여,

while IFS= read -r a && IFS= read -r b && IFS= read -r c
do
    printf "%s %s %s\n" "$a" "$b" "$c"
done

산출

ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

관련 정보