在AWK中为多个文件更改FS

The*_*Jsp 4 unix awk fs

我正在尝试在AWK脚本中读取多个文件但是当我在文件之间切换时,字段分隔符(FS)也需要更改.此时我得到了:

FILENAME=="A.txt"{
    FS=";"
    //DoSomething
}
FILENAME=="B.txt"{
    FS=" - "
    //DoSomething
}
Run Code Online (Sandbox Code Playgroud)

但正如您可能知道的那样,FS将无法正确设置文件的第一行.我怎么解决这个问题?

Håk*_*and 9

您可以在命令行指定字段分隔符:

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运行开始时或在输入文件之间设置.


Ed *_*ton 6

你可以像@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)开始一次.