awk에서 새 줄을 인쇄하는 방법

awk에서 새 줄을 인쇄하는 방법

각 데이터 세트가 줄 바꿈(\n)으로 래핑된 파일에서 수집된 데이터를 인쇄하려고 합니다.

암호:

awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump2.txt

이제 다음을 출력합니다.

mail: [email protected] , fullName: Bogus Bogus, uid: 666  mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667

원하는 출력:

mail: [email protected] , fullName: Bogus Bogus, uid: 666 \n
mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667 \n

답변1

노력하다

 awk '/mail:|fullName:/{s=s", "$0} /uid:/ {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt

필드에 %가 없다고 가정

기타 솔루션

 awk '/mail:|fullName:/{s=s", "$0} /uid:/ {print substr(s,3) ", "$0 ;s=""} ' dump2.txt

uid:가 마지막이라고 가정합니다.

답변2

\n원하는 위치에 추가하기 만 하면 됩니다 .

awk '/mail:|fullName:|uid:/{s=s", "$0}\n END{print substr(s,3)}' dump2.txt

답변3

또 다른 비결: 하나의 큰 문자열에 모두 저장하는 대신, 진행하면서 인쇄하세요.

awk '$1=="mail:" || $1=="fullName:" {printf "%s, ", $0} $1=="uid:"' dump2.txt

답변4

참고: 아래의 모든 내용은 해당 uid:행이 항상 각 그룹의 마지막 행이라고 가정합니다. 그러나 이는 모두 %데이터의 문자에 적용됩니다.

모든 데이터를 저장하고 마지막에 인쇄하려면 배열을 사용하는 약간 더 쉬운 방법이 있습니다.

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count] = s[count] ", " $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) print substr(s[i],3)}' dump2.txt

(마지막에) 필드를 개별적으로 처리하려면 2D 배열을 사용하십시오.

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%s, %s, %s\n",
                s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt

(Glenn의 답변과 마찬가지로 mail:, fullName:uid:문자열이 줄의 첫 번째 필드로 나타나는 것으로 가정합니다.)

정렬을 언급할 때 무슨 뜻인지는 모르겠지만 여기서 시작하면 출력에서 ​​필드를 쉽게 정렬할 수 있습니다.

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%23s, %23s, %s\n",
                s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt

또는

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%-23s, %-23s, %s\n",
                s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt

또는

awk 'BEGIN {count=0}
     /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
     END {for (i=0; i<count; i++) printf "%-23s %-24s %s\n",
                                    s[i]["mail:"] ",",
                                    s[i]["fullName:"] ",",
                                    s[i]["uid:"]}' dump2.txt

이 답변 각 필드의 최대 데이터 길이를 결정하는 방법을 보여줍니다.

관련 정보