我正在使用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- ASCII
0
是\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