열 구분 기호가 있는 모든 행을 Unix의 단일 행으로 결합합니다.

열 구분 기호가 있는 모든 행을 Unix의 단일 행으로 결합합니다.

내 유닉스 출력은

ABC : 123
DEFG : 4587
MJk : 36

다음과 같은 동일한 구분 기호를 사용하여 모든 행을 단일 행으로 병합하고 싶습니다.

ABC DEFG MJK : 123 4587 36

나는 단일 열에 출력을 인쇄하기 위해 awk를 사용하는 것을 알고 있습니다.

awk'{print $1}' | tr '\n' ' ' 

하지만 인쇄 중

ABC DEFG MJK 

값이 아님 123 4587 36

답변1

$ awk -F: '{a=a $1; b=b $2} END{print a FS b}' file
ABC DEFG MJk : 123 4587 36

tr '\n' ' '최근에 사람들 이 개행 문자를 다른 것으로 변환하기 위해 유사한 방법을 사용하는 게시물을 많이 보았습니다 . POSIX 텍스트 파일(모든 POSIX 텍스트 처리 도구에서 읽을 수 있음)을 다른 YMMV 형식 파일로 변환하므로 드문 경우를 제외하고는 이 작업을 수행하지 마십시오. POSIX 텍스트 줄은 로 끝나며 \n, POSIX txt 파일은 POSIX 텍스트 줄로 구성됩니다. tr또는 다른 방법을 사용하여 모든 줄 바꿈을 제거 하면 후속 POSIX 텍스트 처리 도구(awk, sed 등)가 이를 입력으로 사용하여 정의되지 않은 동작을 수행할 수 있습니다.

다음은 예상하지 못했지만 실제로 POSIX에서 정의한 다른 동작의 몇 가지 예입니다. 이 여러 줄 문자열을 공백으로 구분된 단일 줄로 변환한다고 가정해 보겠습니다.

$ printf 'foo\nbar\n' | wc -l
       2

tr모든 것을 제거 하려면 \n:

$ printf 'foo\nbar\n' | tr '\n' ' '
foo bar $
$ printf 'foo\nbar\n' | tr '\n' ' ' | wc -l
       0

POSIX 텍스트 파일과 동일하게 출력하는 더 나은 접근 방식과 비교하여 다음으로 파이프될 때 더 직관적인 결과를 제공합니다 wc.

$ printf 'foo\nbar\n' | paste -sd ' ' -
foo bar
$ printf 'foo\nbar\n' | paste -sd ' ' - | wc -l
       1

답변2

이는 sed 편집기를 사용하여 tge 패턴 공간에 다음 줄을 추가하고 중앙 콜론 주변의 필드를 섞는 방식으로 수행할 수 있습니다. 테스트 명령은 eof까지 반복되며 각 반복에서 다음 줄을 선택합니다.

sed -Ee '
  :a;$!N;s/(.*):(.*)\n(.*):(.*)/\1\3:\2\4/;ta
' file

awk 버전은 설명이 필요 없습니다.

awk -F ':' -v ORS='' '
{ a[NR] = $1; b[NR] = $2 }
END {
  a[NR] = a[NR] FS
  for (i=1; i<=2*NR; i++)
     print i<=NR ? a[i] : b[i-NR]
  print RS
}
' file

결과:

ABC DEFG MJK : 123 4587 36

답변3

전체 내용을 버퍼링해야 할 것 같습니다. 다음을 시도해 볼 수 있습니다.

awk '{FNR==1{first=$1; second=$3} FNR>1{first=first " " $1; second=second " " $3} END{printf("%s : %s\n", first, second)}'

이는 변수의 모든 행에 대한 모든 "첫 번째 열 항목"의 내용 first과 변수의 "두 번째 열 항목"의 내용을 누적합니다(실제로는 세 번째 열입니다. s의 관점에서는 :자체적인 열을 형성 하기 때문입니다). 행). awk바꾸다 second. 마지막으로 :구분 기호를 구분 기호로 사용하여 누적된 버퍼를 인쇄합니다 .

선행/후행 공백이 문제가 되지 않으면 코드를 다음과 같이 단축할 수 있습니다.

awk '{first=first " " $1; second=second " " $3} END{printf("%s : %s\n", first, second)}'

답변4

차라리 각 열을 배열에 저장한 다음 원하는 형식으로 인쇄하고 싶습니다.

awk -F" : " '{a[NR]=$1;b[NR]=$2} END{ for(i=1;i<=NR;i++) printf "%s ",a[i]; printf ": "; for(i=1;i<=NR;i++) printf "%s ",b[i];}' file
  • -F" : "" : "구분 기호를 기준으로 열을 구분합니다.
  • {a[NR]=$1;b[NR]=$2}두 개의 배열 인덱스 = NR(행 수) 및 값 = 해당 행의 열 값을 만듭니다.
  • printf원하는 순서대로 인쇄합니다. ( printfa는 인쇄되지 않습니다 newline.)

관련 정보