이식 가능한 방식으로 파일 간 AWK에서 RS 변수를 변경하는 방법

이식 가능한 방식으로 파일 간 AWK에서 RS 변수를 변경하는 방법

다른 질문을 보는 동안 awk 프로그램에 두 개의 파일이 필요한 경우(즉, 비교를 위해 첫 번째 파일의 항목을 배열로 읽어들이는 경우(보통 이러한 경우)) awk에서는 일반적으로 해결할 수 없는 문제를 발견했습니다. 파일 간의 RS 변경을 처리하는 방법은 무엇입니까?

다음 파일이 제공됩니다.

~$> cat awktest1.txt 
111 112 113 114|121 122 123 124|131 132 133 134|141 142 143 144
 ~$> cat awktest2.txt 
211 212 213 214

221 222 223 224

231 232 233 234

241 242 243 244

기본 예로 다음 명령을 실행하려면 다음을 수행하십시오.

#! /usr/bin/awk -f

# awktest.awk file1 file2
# cant swap RS between files

BEGIN { RS="|" }

NR>ONR && ONR==1 { RS="" }
{ print $1 "." $2 "." $3 "." $4 }

# will work with with, but this is GNU only.
# ENDFILE { RS="" }
END { print "\nfinal $0: \n" $0 }

그런 다음 RS두 번째 파일의 첫 번째 레코드를 읽은 후 변경이 발생하므로 이(인위적인 예)에서 출력은 다음과 같습니다.

~$>./awktest.awk awktest1.txt awktest2.txt 
111.112.113.114
121.122.123.124
131.132.133.134
141.142.143.144
211.212.213.214

final $0:
211 212 213 214

221 222 223 224

231 232 233 234

241 242 243 244

두 번째 파일의 모든 내용은 4가 아닌 단일 레코드로 읽혀집니다. 분명히 이 예에서 awk 이전의 문제를 해결하는 것은 간단했지만 실제로 awk에 어떤 방법이 있습니까?

답변1

파일 이름 및 할당과 같은 매개변수를 혼합할 수 있으므로 다음을 실행할 수 있습니다.

awk '{ print $1 "." $2 "." $3 "." $4 }' RS='|' file1 RS='' file2

각 파일마다 다른 값을 설정할 수 있도록 awk순차적으로 처리합니다 .RS


awk이 문자가 포함된 파일 이름 은 =.
문제를 해결하는 방법은 다음과 같습니다..

관련 정보