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