![Unix 스크립트를 사용하는 AWK 문제](https://linux55.com/image/123695/Unix%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20AWK%20%EB%AC%B8%EC%A0%9C.png)
이 파일이 있어요
AK3*BPS*2
AK4*8*0510*1
AK3*RMT*12
AK4*1*0128*7*CR
이 출력을 원합니다
BPS 2 1
RMT 12 7 CR
이 명령을 사용하고 있습니다
awk -F* '$1=="AK3" { print $2, $3 } "\c" ($1=="AK4" { print $4, $5 }' $FileHome/badfile_$session_num.txt >> $FileHome/input_output_record.txt
그런데 이런 결과가 나오네요
BPS 2
1
RMT 12
7 CR
어떤 조언이라도 대단히 감사하겠습니다.
답변1
당신은 다음을 원하는 것 같습니다:
- 각 줄의 마지막 두 필드
AK3
뒤에는 - 자유투 라인의 4번째와 5번째
AK4
(5번째는 분실될 수 있음).
$ awk -F '*' '/^AK3/ { printf("%s\t%s", $2, $3) } /^AK4/ { printf("\t%s\t%s\n", $4, $5) }' data.in
BPS 2 1
RMT 12 7 CR
답변2
또 다른 방법은 출력 레코드 구분 기호(ORS)를 직접 제어하는 것입니다.
$ awk -F'*' '$1=="AK3"{ORS=OFS; print $2, $3} $1=="AK4"{ORS=RS; print $4, $5}' ip.txt
BPS 2 1
RMT 12 7 CR
- 기본적으로 OFS(출력 필드 구분 기호)는 단일 공백입니다.
- 입력 레코드 구분 기호(RS)는 개행 문자입니다.
이는 다양한 OFS에 대해 쉽게 수정되며 빈 필드도 표시합니다.
$ awk -F'*' -v OFS=',' '$1=="AK3"{ORS=OFS; print $2, $3} $1=="AK4"{ORS=RS; print $4, $5}' ip.txt
BPS,2,1,
RMT,12,7,CR
답변3
Plain은 print
개행(출력 레코드 구분 기호)을 추가하지만 printf
그렇지 않으므로 AK3
필드 사이에 명시적인 구분 기호가 있는 상황에서 사용할 수 있습니다. 이 AK4
경우 첫 번째 필드 앞에 필드 구분 기호가 있어야 하며, 가장 쉬운 방법은 먼저 빈 필드를 인쇄하는 것입니다.
$ awk -F\* '$1=="AK3" { printf "%s", $2 OFS $3 } $1=="AK4" { print "", $4, $5 }' < input
BPS 2 1
RMT 12 7 CR
-vOFS='\t'
이는 명령줄 시작 부분에 추가하기만 하면 탭으로 구분된 출력을 제공하도록 쉽게 변환됩니다 .
그러나 고정 너비 열을 원하는 경우 형식 printf
에서 너비 설정을 사용하는 것이 가장 쉽습니다 %s
.
$ awk -F\* '$1=="AK3" { printf "%-3s %-2s", $2, $3 } $1=="AK4" { printf " %-1s %s\n", $4, $5 }' < input
BPS 2 1
RMT 12 7 CR
너무 긴 필드는 최대 필드 너비를 지정하지 않는 한 계속 확장됩니다. %-3.3s
예를 들어 입력 줄의 순서가 올바르지 않은 경우 손상된 출력이 생성됩니다.
답변4
다음 명령으로 결과를 얻었습니다.
sed -n '1~2p' testfile.txt| awk -F "*" '{print $2,$3}' >> op.txt
sed -n '2~2p' testfile.txt | awk -F "*" '{print $4,$5}' >> op.txt
sed -n '1~2p' op.txt |sed "N;s/\n/ /g" |awk '{print $0"\n"}'; sed -n '2~2p' op.txt| sed "N;s/\n/ /g"
산출
기준점 2 1
RMT 12 7 CR