我正在尝试用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!
答案 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