![如何以可移植的方式在文件之间更改 AWK 中的 RS 变量](https://linux22.com/image/126038/%E5%A6%82%E4%BD%95%E4%BB%A5%E5%8F%AF%E7%A7%BB%E6%A4%8D%E7%9A%84%E6%96%B9%E5%BC%8F%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B9%8B%E9%97%B4%E6%9B%B4%E6%94%B9%20AWK%20%E4%B8%AD%E7%9A%84%20RS%20%E5%8F%98%E9%87%8F.png)
在查看另一个问题时,我遇到了一个对于 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
asawk
将按顺序处理它们,以便您可以RS
为每个文件设置不同的值。
请注意,awk
包含该字符的文件名可能会阻塞=
。
以下是解决该问题的方法。。