如何使用AWK命令获取有错误的文件名



我正在使用SAC工具读取标题信息,但有些文件没有标题信息,它会打印一个错误。如果文件在工作过程中没有标题或错误,有没有任何方法可以使用AWK打印这些文件。我经常使用AWK进行数据操作,但这次失败了。

这是我的尝试:

saclst a f *2020-05*BHZ*

这是输出

GS.GS043.2020-05-18T03:52.BHZ.sac         3.37
GS.GS043.2020-05-18T09:28.BHZ.sac         3.64
GS.GS043.2020-05-18T12:09.BHZ.sac         3.42
saclst: Error determining SAC header: GS.GS043.2020-05-18T14:36.BHZ.sac
GS.GS043.2020-05-18T16:25.BHZ.sac         2.92
GS.GS043.2020-05-18T18:51.BHZ.sac         3.66

现在我想获得文件名并打印它,但AWK似乎没有帮助;

saclst a f *2020-05*BHZ* | awk '{if ($2<0) print $1;}' > ../test.dat

我的输出文件为空,终端显示此错误:

有没有办法保存这个错误,以便我以后可以修改它?

saclst: Error determining SAC header: SC.LZB.2020-05-21T10:46.BHZ.sac
saclst: Error determining SAC header: SC.LZB.2020-05-21T11:57.BHZ.sac
saclst: Error determining SAC header: SC.LZB.2020-05-26T11:23.BHZ.sac
saclst: Error determining SAC header: SC.LZB.2020-05-28T10:44.BHZ.sac
saclst: Error determining SAC header: SC.QSC.2020-05-12T06:49.BHZ.sac

以下是我认为您正在寻找的内容:

# just for demo, pipe SAC tool to awk for your actual use case
$ cat ip.txt
GS.GS043.2020-05-18T03:52.BHZ.sac         3.37
GS.GS043.2020-05-18T09:28.BHZ.sac         3.64
GS.GS043.2020-05-18T12:09.BHZ.sac         3.42
saclst: Error determining SAC header: GS.GS043.2020-05-18T14:36.BHZ.sac
GS.GS043.2020-05-18T16:25.BHZ.sac         2.92
GS.GS043.2020-05-18T18:51.BHZ.sac         3.66
# filter lines with Error based on number of fields or `Error` in 2nd field
$ awk 'NF != 2' ip.txt
saclst: Error determining SAC header: GS.GS043.2020-05-18T14:36.BHZ.sac
$ awk '$2 == "Error"' ip.txt
saclst: Error determining SAC header: GS.GS043.2020-05-18T14:36.BHZ.sac
# print only last field
$ awk '$2 == "Error"{print $NF}' ip.txt
GS.GS043.2020-05-18T14:36.BHZ.sac

如果saclst命令将带有Error的行放在stderr上,则可以使用以下命令:

$ saclst a f *2020-05*BHZ* 2> error.log

尽管awk(您所要求的(有效,

sed -n 's/.*Error.*:/ /p' ip.txt

也可以。和

grep Error ip.txt

所以,不要只关注使用awk

如果你想清理awk代码(假设+$2是正确的(,请尝试

saclst ... 2>&1 | [g/m/n]awk '(+$2<+_)*(NF=!_)'

我建议+$2的原因是,如果这些值不是"0",那么被读入的输入将进行基于字符串的比较;出现";数字,导致以下情况:无效数据(如第2列中数字前面的感叹号!(最终会使条件求值为true,即使它显然不是负数

  • !\x21
  • ASCII0\x30

这就是它最终无意中通过过滤器的原因:

echo '12 !232523435 2997 ' 

| mawk '$2<0'
12 !232523435 2997 

现在,这只是假设OP最初检查2美元为负的逻辑是准确的。

为了正确处理ip.txt,我测试了另一个变体:

% < ip.txt [g/m/n]awk '/: .+: .+:/ && ($!_=$_=$NF)~_'
GS.GS043.2020-05-18T14:36.BHZ.sac

我创建了一个合成版本的ip.txt,大小为8.27 GB。也许grep或sed更快,但我个人认为awk的532MB/s的过滤吞吐率应该足够了:

pvE0 <  ip2.txt | mawk2 '/: .+: .+:/ && ($!_=$_=$NF)~_' | pvE9 | xxh128sum 
in0: 8.27GiB 0:00:15 [ 532MiB/s] [ 532MiB/s]             
out9:  938MiB 0:00:15 [59.0MiB/s] [59.0MiB/s] [        <=>  ]
e8626c6b7e7c90a5cb21bd00fee6ec41  stdin

相关内容

最新更新