내 파일에 다음 줄이 있습니다
# Employee Id : ABC123,
# Employee Name: Vivek
# Employee Type: Temp Join Date: 31-jan-2014 Buz Code: 2098
# Employee Comments:
# Replacement for Jane
# Country: India
# State: Delhi
#
# Employee Id : GGG67,
# Employee Name: Kumar
# Employee Type: Temp Join Date:15-jan-2014 Buz Code: 2176
# Employee Comments:
# Country: India
# State: Delhi
# Street: Kanot
여기에서 가 필요하며 Employee ID
모든 직원을 표 형식으로 나타냅니다 Employee Name
. Buz Code
시도했지만 awk
예상한 결과를 얻지 못했습니다.
어떤 제안이 있으십니까?
답변1
이미 시도한 것을 보여주면 숙제처럼 보이지 않을 것입니다. 즉, 시작은 다음과 같습니다. 필드 이름을 일치시켜 필드를 가져와야 하지만 다음 레코드에 도달할 때까지 출력하지 마세요. 표시되는 모든 레코드 사이에 "#"이 있으면 편리할 것입니다...
$ awk -F: -f t.awk t
ABC123, Vivek
GGG67, Kumar
더 긴 awk 스크립트를 별도의 파일에 저장하는 것이 도움이 될 수 있습니다.
$ cat t.awk
/Employee Id/ {empid=$2}
/Employee Name/ {name=$2}
/#/ {print empid, name} # What happens if the next record is missing name?
END {print empid, name}
또는 한 줄로:
$ awk -F: '/Employee Id/ {empid=$2}; /Employee Name/ {name=$2}; /#/ {print empid, name}; END {print empid, name}' t
답변2
$ awk '{printf /Employee Id|Employee Name|Buz Code/? $NF" " : " "}' file
$NF
일치하는 패턴이 발견되면 마지막 필드를 인쇄합니다. 예를 들어 Employee Id
... |
그렇지 않으면 ?
단일 공백을 인쇄합니다 " "
.
열 순서 결과:
ABC123, Vivek 2098 GGG67, Kumar 2176
또는
awk '/Employee Id|Employee Name|Buz Code/ {if(++i%4==0) printf RS;printf $NF FS }' file
이는 RS
개행 문자를 의미하며 \n
단일 FS
공백(기본적으로)을 의미합니다.
행 순서 결과:
ABC123, Vivek 2098
GGG67, Kumar 2176