【问题标题】:awk Print Skipping a fieldawk 打印跳过一个字段
【发布时间】:2014-12-14 04:08:51
【问题描述】:

在 type 为 "" 的情况下,不按顺序打印第 3 个字段,然后打印除第 3 个字段之外的整行。

给定一个制表符分隔行a b c d e 的想法是打印ab<tab>c<tab>a<tab>b<tab>d<tab>e

设置$3="" 似乎会导致后面的打印语句丢失制表符字段分隔符,所以不好。

# $1 = year $2 = movie
BEGIN {FS = "\t"} 
  type=="" {printf "%s\t%s\t", $2 $1,$3; $3=""; print}
  type!="" {printf "%s\t<%s>\t", $2 $1,type; print}
END {print ""} 

坚持一个我不太喜欢的 for 循环,因为解决方案会导致一个空白文件。

# $1 = year $2 = movie
BEGIN {FS = "\t"} 
  type=="" {printf "%s\t%s\t%s\t%s\t", $2 $1,$3,$1,$2; for (i=4; i<=NF;i++) printf "%s\t",$i}
  type!="" {printf "%s\t<%s>\t", $2 $1,type; print}
END {print ""} 

【问题讨论】:

    标签: awk


    【解决方案1】:

    您需要将 OFS 设置为选项卡而不是默认的单个空白字符,并且您不想将 $3 设置为银行字符,因为这样您将在 $2 和 @987654323 之间获得 2 个选项卡@。

    $ cat tst.awk
    BEGIN {FS = OFS = "\t"}
    {
        if (type == "") {
            val = $3
            for (i=3; i<NF; i++) {
                $i = $(i+1)
            }
            NF--
        }
        else {
            val = "<" type ">"
        }
        print $2 $1, val, $0
    }
    $
    $ awk -f tst.awk file | tr '\t' '-'
    ba-c-a-b-d-e
    $
    $ awk -v type="foo" -f tst.awk file | tr '\t' '-'
    ba-<foo>-a-b-c-d-e
    

    |tr '\t' '-' 显然只是为了显示标签所在的位置而添加的。

    如果减少 NF 在您的 awk 中无法删除记录中的最后一个字段,请将其替换为 sub(/\t[^\t]+$/,"")

    【讨论】:

    • 启发性的观察。我宁愿在 tr 后运行后处理双标签,也不愿将 for 循环插入到 awk 中。
    • @IheOnwuka 那么您无法区分最初为空的字段与由于您设置 $3="" 而变为空的字段,因此您会损坏输出。
    • 由于我控制了 3 美元的费用,因此我的这个问题的实例并不担心,但我同意其他人也是如此。
    • $3 的值不是主要问题,而是其他字段的值。看,用一个命令修改你的文本然后通过管道将它传递给另一个命令以尝试纠正你用第一个命令引入的任何问题,这只是一个简单的老坏主意。当然,随心所欲。
    • 您不希望在会导致大量修复的地方这样做,但这并不是一个普遍的坏主意。离得很远。在我的示例中,为什么需要 for 循环当然不是很清楚,而运行 tr a lateri 会使正在发生的事情更加明显。这是对单个程序员的判断。做出让你几乎完成的初始动作并应用任何必要的修复是一种有效的设计技术,尤其是在你做的初始事情相对简单的情况下。
    【解决方案2】:

    一种方式

    awk '{$3=""}1' OFS="\t" infile|column -t
    

    解释

    • {$3=""} 设置列为零
    • 1 同打印,打印行。 OFS="\t"set Output Field Separator Variable to tab, maybe you needn't it, next commandcolumn -t` 重新格式化。
    • column -t 带有标签的列式列表。

    【讨论】:

    • 不理解,但接受了它,因为它引导我阅读我理解的东西。
    • 当字段中有空白字符并且column -t 没有任何用处时将失败。
    • 问题是,如果你有时间,你可以做到完美,就像你做的那样。
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多