我正在处理命名Event_42417555_2018-05-23_16\:45\:28-log.txt
和格式如下的 CSV 文件:
timestamp;fullpath;event;size
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324
1521540649.02;/home/workdir/quad_list_14.json;IN_OPEN;2160
1521540649.03;/home/workdir/quad_list_14.json;IN_ACCESS;2160
1521540649.03;/home/workdir/quad_list_14.json;IN_CLOSE_NOWRITE;2160
我想要的是根据使用正则表达式提取的文件名中的值向该文件添加一列[0-9]{8}
(并删除标题)。
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324;42417555
1521540649.02;/home/workdir/quad_list_14.json;IN_OPEN;2160;42417555
1521540649.03;/home/workdir/quad_list_14.json;IN_ACCESS;2160;42417555
1521540649.03;/home/workdir/quad_list_14.json;IN_CLOSE_NOWRITE;2160;42417555
使用 gnu 工具很容易,就像这样(几乎没有经过测试,几乎可以肯定引号有问题):
#!/bin/bash
#$1 being the filename
JOBID=$(grep -oE "[0-9]{8}" "${1}")
sed -E "s/(.*)/\1;$JOBID/" "${1}"
awk
到目前为止,我想在这里实现这一目标,这是最有效的:
awk -F";" 'JOBID=substr(FILENAME ,match(FILENAME,"[0-9]{8}"),8); \
BEGIN { OFS=";"} { if ($1 != "timestamp") print $0,JOBID; }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head
timestamp;fullpath;event;size
timestamp;fullpath;event;size
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_OPEN;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_ACCESS;2324;42417555
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324
1521540649.02;/home/workdir/ScienceXMLIn/config.cfg;IN_CLOSE_NOWRITE;2324;42417555
我有我的变量并且它设置正确,但我找不到合适的位置。
如果我移动JOBID=substr(FILENAME ,match(FILENAME,"[0-9]{8}"),8);
我无法访问该变量。
这里的问题是文件被处理了两次,一次是正确的(尽管我的条件被忽略了),另一次是它认为我的变量
由于它是每个文件的属性,因此您应该
JOBID
在处理任何文件的第一行时进行计算,即何时FNR
为 1:有多种方法可以提取正则表达式的匹配项;我通常会
match
进入一个数组:理想情况下有一些错误处理。这用于
match
查找文本匹配[0-9]{8}
,并将任何匹配值提取到数组中a
(match
查找组,因此添加了括号)。应该在任何 AWK 实现中使用的另一种方法是将文件名拆分为下划线:
您的版本中出现双倍输出是因为
JOBID=substr(FILENAME ,match(FILENAME,"[0-9]{8}"),8)
它是一个完整的表达式,其权重与您的 AWK 程序中的任何其他表达式具有相同的权重,并带有一个隐式块(ieprint
);它总是匹配的,因为JOBID
它总是非空的并且不是等于零的数值,所以它的块总是被处理。