- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在名为“findError.sh”的 bash 文件中有以下代码:
#!/bin/bash
filename="$1"
formatindicator="\"|\""
echo "$formatindicator"
formatarg="\$1"
echo "$formatarg"
count=`awk -F$formatindicator '{print $formatarg}' $filename | perl -ane '{ if(m/ERROR/) { print } }' | wc -l `
command="awk -F$formatindicator '{print $formatarg}' $filename | perl -ane '{ if(m/ERROR/) { print } }' | wc -l"
echo $command
echo $count
然后我像这样在命令行运行它:sh findError.sh 测试.dat
但它给我的计数与运行回显的命令不同?这怎么可能?
即回显的 $command 是:
awk -F"|" '{print $1}' test.dat | perl -ane '{ if(m/ERROR/) { print } }' | wc -l
但是返回的 $count 是:
3
但是,如果我只是在命令行下面运行这一行(而不是通过脚本)——结果是 0:
awk -F"|" '{print $1}' test.dat | perl -ane '{ if(m/ERROR/) { print } }' | wc -l
示例输入文件(test.dat):
sid|storeNo|latitude|longitude
2|1|-28.03720000
9|2
10
jgn352|1|-28.03ERROR720000
9|2|fdERRORkjhn422-405
0000543210|gfERRORdjk39
注意事项:将 SunOS 与 bash 版本 4.0.17 一起使用
最佳答案
您对格式分隔符周围的引号过于小心。
当你输入时:
awk -F"|" ...
程序 (awk
) 将 -F|
视为它的第一个参数; shell 去掉了双引号。
当你有:
formatindicator="\"|\""
echo "$formatindicator"
formatarg="\$1"
echo "$formatarg"
count=`awk -F$formatindicator ...`
您在 $formatindicator
中保留了双引号,因此 awk
将 -F"|"
视为分隔符,并使用双引号引号作为分隔符。
使用:
formatindicator="|"
echo "$formatindicator"
formatarg="\$1"
echo "$formatarg"
count=`awk -F"$formatindicator" ...`
不同之处在于 shell 会去掉 -F"$formatindicator"
中的引号,但当 $formatindicator
本身包含双引号时不会这样做。
(注意:已编辑以保留反引号而不是 $(...)
表示法,这是 (a) 首选和 (b) 用于此答案的第一个版本。 $(...)
符号不被 SunOS /bin/sh
识别,我相信它被用来执行脚本。bash
和 ksh
识别 $(...)
符号,但基本的 Bourne shell,/bin/sh
,在 Solaris 10 上(SunOS 5.10) 及更早版本(我没有接触过 Solaris 11)无法识别 $(...)
。)
我注意到 perl
、awk
或 grep
中的任何一个都可以用来自行查找错误行数,所以awk
的三元组通过管道传输到 perl
并通过管道传输到 wc
效率不高。
awk -F"|" '$1 ~ /ERROR/ { count++ } END { print count }' $filename
grep -c ERROR $filename # simple
grep -c '^[^|]*ERROR[^|]*|' $filename # accurate
perl -anF"|" -e '$count++ if $F[0] =~ m/ERROR/; END { print "$count\n"; }' $filename
它是 Perl,所以 TMTOWTDI ;选择你...
在评论中,我们担心脚本的各个部分是如何被解释的。
formatindicator="|"
formatarg="\$1"
count=`awk -F$formatindicator '{print $formatarg}' $filename | perl -ane '{ if(m/ERROR/) { print } }' | wc -l `
让我们将其简化为(使用我的主要答案的一部分):
count=`awk -F"$formatindicator" '{print $formatarg}' $filename`
目的是通过 -F
选项在命令行上指定分隔符(成功发生)。我预计问题是“为什么 $formatarg
在单引号内展开?”。答案是“是吗?”。我想不是。所以,正在发生的事情是 awk
正在查看脚本 {print $formatarg}
。由于 formatarg
没有赋值,它相当于 0,所以脚本打印了 $0
,也就是整个输入行。如果 Perl 在该行的任何位置匹配 ERROR,Perl 很乐意回显该行,并且 wc
不会关心行中的内容,因此结果大致与预期的一样。唯一会出现差异的情况是 $filename
中的行在第一个竖线分隔字段以外的地方包含 ERROR。这将被脚本计算在不应计算的地方。
关于linux - unix - awk 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8640811/
是否可以从 awk 文件执行另一个 awk 文件?使用 awk 文件我需要执行当前文件夹中的所有 awk 文件。是否可以在 awk 中进行此类操作? 最佳答案 是的你可以。您需要使用 system()
这是一个 awk 脚本,它尝试根据第一列设置两个文件的差异: BEGIN{ OFS=FS="\t" file = ARGV[1] while (getline < file)
awk 逐行处理文件。假设每一行操作不依赖于其他行,有没有办法让 awk 一次并行处理多行? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据? 最佳答案 唯一试图提供 awk 并行实现的
我有文件: 结果.txt Apple fruits 10 20 30 Car vehicle 40 50 60 Book study 70 80 90 假设这里第 2 列是特征,第 3 列是最小值
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对 awk 的行为感到惊讶表演时浮点数 计算。它导致我对表格数据进行错误计算。 $ awk 'BEGIN {print 2.3/0.1}' 23 0.1}' )。 那么我应该如何执行大于 (
为什么我在下面的例子中得到分隔符前后的空格? awk -F'^' '{print $1,":",$2}' SERVER_2012-02-29-12-15-00 3969 : 1272 3969 :
我有一个文件,其中每四行是这样的: HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG (对于那些感兴趣的人,此文件包含DNA序列) 我需
你能帮我按 $2 列中的坐标合并行吗?有一系列坐标以一个为单位增长。我想输出 f.e. :第 1 行合并到第 4 行 9079811-9079814,之后没有系列,因此将其合并到另一行等。对于输入中的
大家好,我是 awk 的新手,我可以问一下我有这样的输入文件吗: # ABC DEFG value1 GH value2 GH value3 GH # BCF SQW value4 GH value5
大家好,我想问一下,我对awk中的括号{}感到非常困惑,就像我写了一段代码 { FNR == 3 { print $1 " age is " $2 } } 但它在外括号上给了我错误但没有在打印语
我想知道如何在 awk 中使用多行注释。到目前为止,我一直在使用 # 来评论一行。有人可以就此指导我。谢谢你。 最佳答案 AWK 中没有多行注释,但如果需要,您可以伪造它。这是一种至少适用于 GNU
关于AND逻辑运算符的一个基本问题。我试图根据第1列和第2列的值提取数据文件niveles.csv中的某些字段。我想写一个awk语句,说“当field1 = date和field2 = area然后打
以下命令按预期工作。 # some command | awk '/(\|\|\)/,/;/' create table todel1 (id int) max_rows=2 /*!*/; alter
我有一个日志文件,需要在服务器上“重播”。 它包含这样的条目: Request: query: EXEC prc_insert_customer @param0: 11
如何从制表符分隔的字符串中选择第一列? # echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{prin
我正在尝试在目录中的多个文件的内容中执行一些 grep 并将我的 grep 匹配附加到单个文件中,在我的输出中我还想要一个包含文件名的列,以了解哪些文件条目已被拾取。我试图使用 awk 来实现相同的目
我想选择文件中第9列的绝对值小于500的行。列有时为正,有时为负。 awk -F'\t' '{ if ($9 output.bam 到目前为止这不起作用..互联网上的一轮告诉我,要使用绝对值,我们应
例如,假设我运行以下命令: gawk -f AppendMapping.awk Reference.tsv TrueInput.tsv 假设文件名会改变。在遍历第一个文件时,我想创建一个映射。 map
我正在使用这个命令; awk -v regex1='new[[:blank:]]+File\(' 'BEGIN{print "Regex1 =", regex1}' 这警告我; awk: warnin
我是一名优秀的程序员,十分优秀!