awk中的操作顺序?

时间:2014-11-25 15:20:26

标签: awk gawk

我正在尝试用awk做两件事。我想将列表分成三个单独的列表,并将每个列表的1或2列转换为正则表达式。当我管道awk到自己,即在我的列表中选择我的项目,然后使用awk进行替换时,它会向列表项添加1。

我想我不需要把awk管道给自己,而是在一次调用awk时完成所有这些操作。

AH??0*,*,ARRAY RESISTIVITY,RESISTIVITY
AHD*,*,MEASURED DEPTH,REFERENCE
AI*,*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS
AI_AVG_HOR_SIG,*,ACOUSTIC IMPEDANCE,ACOUSTIC
*,FOO,BAR,BLEH

列表一行是第4行,第一列没有通配符,替换第2列中的通配符。

列表2将在单独的列表中用于第1,2和3行,并且需要在第1列和第2列进行替换。

最后,我需要在单独的列表中为第5行做类似的事情。

我能够得到这个列表。

第4行:awk -F \, '$1!~/([\*\?])/' file.txt
第1-3行:awk -F \, '$1~/([\*\?])/' file.txt
第5行:awk -F \, '$1~/^\*$/' file.txt

我的潜艇是* => 。*和? => [0-9]。

当我尝试使用像这个awk -F \, 'gsub(/\*/,".*",$2) $1!~/([\*\?])/' OFS=, file.txt这样的gsub时,列表会带来意想不到的结果。我觉得好像有一个基本的东西我不了解关于堆叠操作的awk。

HALP!

1 个答案:

答案 0 :(得分:1)

我在这里写的不是你问题的解决方案。这只是一个练习 重新组织你的版本......(为你完成:)。 一些@Etan明智的建议仍然缺失。 (文体问题可以节省我们很多时间)。

awk(或任何单线解决方案)令人困惑,超过30个字符。 行情等变得困难。

您可以(应该?)将其写入文件(a.awk)中,并使用适当的缩进,注释,垂直对称:

#!/usr/bin/gawk -f

BEGIN                          { FS="," ; OFS=","     }

$1 ~ /[\*\?]/ && $1 !~ /^\*$/  { gsub(/\*/, ".*"   ,$1 );
                                 gsub(/\?/, "[0-9]",$1 );
                                 gsub(/\*/, ".*"   ,$2 );
                                 print; }

并将其用作awk -f a.awk inputfile

目前的行为是:

echo 'AH??0*,*,ARRAY RESISTIVITY,RESISTIVITY
AHD*,*,MEASURED DEPTH,REFERENCE
AI*,*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS
AI_AVG_HOR_SIG,*,ACOUSTIC IMPEDANCE,ACOUSTIC
*,FOO,BAR,BLEH' | awk -f /tmp/a1

AH[0-9][0-9]0.*,.*,ARRAY RESISTIVITY,RESISTIVITY
AHD.*,.*,MEASURED DEPTH,REFERENCE
AI.*,.*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS