我正在尝试在AWK脚本中读取多个文件但是当我在文件之间切换时,字段分隔符(FS)也需要更改.此时我得到了:
FILENAME=="A.txt"{
FS=";"
//DoSomething
}
FILENAME=="B.txt"{
FS=" - "
//DoSomething
}
Run Code Online (Sandbox Code Playgroud)
但正如您可能知道的那样,FS将无法正确设置文件的第一行.我怎么解决这个问题?
您可以在命令行指定字段分隔符:
awk -f a.awk FS=";" A.txt FS=" - " B.txt
Run Code Online (Sandbox Code Playgroud)
这样,字段分隔符将针对每个文件进行更改.来自http://www.delorie.com/gnu/docs/gawk/gawk_82.html:
可以通过在调用awk时在命令行的参数中包含变量赋值来设置任何awk变量
和
有了它,变量在awk运行开始时或在输入文件之间设置.
你可以像@HakonHaegland建议的那样,如果你单独列出文件,可以在arg列表中的文件名之间设置FS.这是执行此操作的典型方法.
或者,如果您不能这样做(例如,因为您需要使用*或类似于文件列表),那么如果您使用GNU awk,则可以使用BEGINFILE,但是否则您可以通过添加在更改FS以强制awk重新拆分记录后,为自己分配$ 0.例如:
$ cat file
a-b-c
d e f
$ awk '{print NF, $1}' file
1 a-b-c
3 d
$ awk '{FS="-"; $0=$0; print NF, $1}' file
3 a
1 d e f
Run Code Online (Sandbox Code Playgroud)
如果您打算这样做,最好在每个文件的开头(当FNR==1)开始一次.