【问题标题】:nawk whitespace trim with multiple condition具有多个条件的 nawk 空格修剪
【发布时间】:2023-03-17 10:36:01
【问题描述】:

temp_file.txt

|112233456543214 |
|154233456873221|
|154233456868320|

当我使用下面的 nawk 命令时,如果你有空白空间,我看到数据正在跳过,所以我必须修剪空白。我必须在下面的命令中包含空白修剪(知道使用 nwak 命令单独)这是挑战。我的问题是如何在下面的命令中包含空白修剪

nawk -F '|' 'BEGIN{FS=OFS="|"}(length($2) >=13){
  $2=substr($2,1,6)"xxxxxx"substr($2,length($2)-3)}1' temp_file.txt>tmp.txt && mv tmp.txt temp_file.txt

【问题讨论】:

    标签: shell unix nawk


    【解决方案1】:

    因为第一个字符是管道,所以您的$1 将始终是空字符串。您想检查 $2 的数据。

    awk -F\| -v OFS=\| '{gsub(/(^[[:blank:]]+)|([[:blank:]]+$)/, "", $2)} 1' <<END
    |112233456543214 |
    |  154233456873221  |
    | 154233456868320|
    END
    
    |112233456543214|
    |154233456873221|
    |154233456868320|
    

    如果您使用-F,则无需在 BEGIN 块中定义 FS。


    如果你想把它拼出来:

    $ nawk -F '|' '
        BEGIN {OFS = FS}
        function obfuscate(string) {
            gsub(/(^[[:blank:]]+)|([[:blank:]]+$)/, "", string)
            return substr(string,1,6) "xxxxxx" substr(string,length(string)-3)
        }
        length($2) >= 13 {$2 = obfuscate($2) }
        1
    ' <<END
    |112233456543214 |
    |  154233456873221  |
    |123456789012|
    |1234567890123|
    |12345678901234|
    | 154233456868320|
    END
    
    |112233xxxxxx3214|
    |154233xxxxxx3221|
    |123456789012|
    |123456xxxxxx0123|
    |123456xxxxxx1234|
    |154233xxxxxx8320|
    

    【讨论】:

    • 问题是如何在命令 nawk -F '|' 中包含修剪'BEGIN{FS=OFS="|"}(length($1) >=13){ $1=substr($1,1,6)"xxxxxx"substr($1,length($1)-3)}1' temp_file。 txt>tmp.txt && mv tmp.txt temp_file.txt
    • 完成。使用tmp=$(mktemp) 而不是“tmp.txt”
    • 或者您可以使用 OP 的 BEGIN 分配并省略 -F。您的第一个示例显示了“x”替换,但您省略了执行此操作的功能。
    • 谢谢@DennisWilliamson,不好的剪切'n'paste
    【解决方案2】:

    nawkFS 的定义中支持正则表达式。您可以使用它来修剪前导和尾随空格或制表符。

    nawk -F '[[:blank:]]*[|][[:blank:]]*' 'BEGIN{OFS = "|"} (length($2) >= 13) {
        $2 = substr($2, 1, 6) "xxxxxx" substr($2, length($2) - 3)}1'
    

    管道被方括号包围,以防止它充当正则表达式交替运算符。正则表达式表示使用零个或多个空格(空格或制表符)后跟一个竖线字符后跟零个或多个空格的组合作为字段分隔符。

    【讨论】:

    • @Denis Thx。我尝试应用相同的命令,但我没有看到它正在工作。它正在跳过“x”替换逻辑
    • @Senthil:它对我有用。你的nawk 是什么版本?我的是/usr/bin/nawk -&gt; /etc/alternatives/nawk -&gt; /usr/bin/gawk,这可以解释它为什么起作用。但是,Sun nawk 手册页说 FS 支持正则表达式。格伦杰克曼的例子对你有用吗? (或者也许这是他的第一个例子,它完全缺少“x”替换,这给你带来了问题,而不是我的)
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多