기본적으로 GNU Awk 4.0.1이 설치된 Linux(USB 키의 Mint)에서 다음 스크립트를 실행했습니다.
awk가 반환한 오류는 다음과 같습니다.
awk: cmd. line:7: /^Observation/,/^@@@/ {sub("/^N° of case: \\(.*\\)$","\\1\\$"); print}
awk: cmd. line:7: ^ syntax error
스크립트는 다음과 같습니다(여기에서 제거한 일부 관련 없는 코드 줄을 "..."으로 대체).
#!/bin/bash
...
awk 'BEGIN \
{
FS = "@@@\n"; RS = "###-###\n"; OFS = "$"; ORS = "\n"; SUBSEP = ","
printf("CaseNum$Department$Topic\n");
}
{
# Body awk script
/^Observation/,/^@@@/ {sub("/^N° of case: \\(.*\\)$","\\1\\$"); print}
/^Observation/,/^@@@/ {sub("/^Department: \\(.*\\)$","\\1\\$"); print}
/^Observation/,/^@@@/ {sub("/^Topic: \\(.*\\)$","\\1\\$"); print}
}
END \
{
#printf("Number of records processed : %d",NR);
}' input.txt > out.csv
참고로, 스크립트에 의해 구문 분석된 input.txt 파일은 다음과 같습니다(여기서 "Blabla"는 무엇이든 될 수 있고 길이도 제한되지 않습니다).
...
Observation
Blabla
N° of case: ZX56734562
Blabla
Department: 56
Blabla
Topic: ER
Blabla
@@@
Blabla
@@@
Blabla
###-###
Observation
Blabla
N° of case: RF34678432
Blabla
Topic: TYG
Blabla
@@@
Blabla
...
일부 필드가 누락될 수 있지만 out.csv 파일은 생략된 필드를 포함한 모든 필드를 유지해야 합니다(예: 여기에서 두 번째 레코드의 "부서" 필드가 누락되고 out.csv 파일이 비어 있음).
다음 out.csv(csv 형식, 첫 번째 행의 헤더)를 가져오고 싶습니다.
CaseNum$Department$Topic
ZX56734562$56$ER
RF34678432$$TYG
sed 사용법을 알고 있는데 awk를 사용하고 싶습니다. 또한 내 코드의 구조(1개의 압축 코드 대신 몇 줄, BEGIN 및 END 블록, "Blabla"에서 잘못된 필드를 찾는 것을 방지하기 위한 두 개의 패턴 필터)를 유지하고 싶습니다.
미리 감사드립니다.
답변1
awk 'BEGIN {
...
}
# the next line should NOT be within curly braces
$1 ~ /^Observation/, $1 ~ /^@@@/ { ... }
{
...
}
END{
...
}' input.txt > out.csv
답변2
달성하려는 목표가 정확히 무엇인지는 확실하지 않지만 요구 사항에 맞는 단순화된 버전은 다음과 같습니다.
awk '
BEGIN { ORS = "$" }
/^N° du cas:/,/^@@@/ {
sub("N° du cas: ","\n")
if($1!="@@@")
print
}
{ next }
END {
printf("\n")
printf("Number of records processed : %d",NR)
}'
예제 입력에 따른 출력은 다음과 같습니다.
ZX56734562$Blabla$
RF34678432$Blabla$