【发布时间】:2014-06-27 00:55:31
【问题描述】:
我正在尝试在 AWK 脚本中读取多个文件,但是当我在文件之间进行更改时,字段分隔符 (FS) 也需要更改。此时我得到:
FILENAME=="A.txt"{
FS=";"
//DoSomething
}
FILENAME=="B.txt"{
FS=" - "
//DoSomething
}
但您可能知道,文件第一行的 FS 设置不正确。我该如何解决这个问题?
【问题讨论】:
我正在尝试在 AWK 脚本中读取多个文件,但是当我在文件之间进行更改时,字段分隔符 (FS) 也需要更改。此时我得到:
FILENAME=="A.txt"{
FS=";"
//DoSomething
}
FILENAME=="B.txt"{
FS=" - "
//DoSomething
}
但您可能知道,文件第一行的 FS 设置不正确。我该如何解决这个问题?
【问题讨论】:
您可以在命令行中指定字段分隔符:
awk -f a.awk FS=";" A.txt FS=" - " B.txt
这样,每个文件的字段分隔符都会改变。 来自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
如果你打算这样做,最好在每个文件的开头只做一次(当FNR==1时)。
【讨论】: