在AWK中为多个文件更改FS

时间:2014-05-09 10:12:25

标签: unix awk fs

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

FILENAME=="A.txt"{
    FS=";"
    //DoSomething
}
FILENAME=="B.txt"{
    FS=" - "
    //DoSomething
}

但是您可能知道,FS将无法正确设置文件的第一行。我该如何解决这个问题?

2 个答案:

答案 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时)。