在查看另一个问题时,我遇到了一个我通常无法为 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
Run Code Online (Sandbox Code Playgroud)
如果我想运行以下,作为一个基本的例子:
#! /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 }
Run Code Online (Sandbox Code Playgroud)
然后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
Run Code Online (Sandbox Code Playgroud)
将所有第二个文件作为单个记录读取,而不是 4 个。很明显,在这个例子中,在 awk 之前解决这个问题很简单,但实际上在 awk 中有什么方法吗?
文件名和赋值等参数可以混合使用,这样你就可以运行:
awk '{ print $1 "." $2 "." $3 "." $4 }' RS='|' file1 RS='' file2
Run Code Online (Sandbox Code Playgroud)
asawk将按顺序处理它们,以便您可以RS为每个文件设置不同的。
请注意,awk可能会因包含该=字符的文件名而窒息。
这是解决此问题的方法。.