각 데이터 세트가 줄 바꿈(\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
➘
우편:[이메일 보호됨], 전체 이름: Bogus Bogus, uid: 666 우편:[이메일 보호됨], 전체 이름: Bogus2 Bogus2, uid: 667또는
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
➘
우편:[이메일 보호됨] , 전체 이름: Bogus Bogus, uid: 666 우편:[이메일 보호됨], 전체 이름: Bogus2 Bogus2, uid: 667또는
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
➘
우편:[이메일 보호됨], 전체 이름: Bogus Bogus, uid: 666 우편:[이메일 보호됨], 전체 이름: Bogus2 Bogus2, uid: 667
이 답변 각 필드의 최대 데이터 길이를 결정하는 방법을 보여줍니다.