【问题标题】:Bourne Script process tab delimited file & replace empty tab variablesBourne Script 处理制表符分隔文件并替换空制表符变量
【发布时间】:2018-02-27 05:01:12
【问题描述】:

我有一个制表符分隔的文件,我需要访问每个制表符。大多数情况下,每个选项卡都会有一个字符串 & ,这对 AWK 来说很容易。但是,有时选项卡会是空的,我不知道如何更改它们。我需要用“x”替换那里的空选项卡。我已经尝试过 sed、awk 甚至是带有 while 循环的计数器。我目前的尝试是使用 if 循环来测试“”。不知道该怎么办.. 谢谢。

middlename=$(cat $1 | awk '{print $3}')

if test $middlename = " "
then
        echo "yes"
fi

【问题讨论】:

  • Quib​​ble: /bin/sh 在任何现代系统上都不是 Bourne,它是 POSIX sh。要区分这两者,您可以使用 GNU Autotools 所做的相同技术:检查 ^ 是否充当管道字符。在 1970 年代的 Bourne 中,echo hello ^ cat 将发出 hello,而在 1990 年代的 POSIX sh 及其兼容的衍生物中,它将发出 hello ^ cat
  • 无论如何,你需要更多的报价,shellcheck.net 会告诉你而不需要人工参与。例如,if test "$middlename" = "" 会做得很好。
  • 不行,文件数据是这样的。
  • tom"blank"henrydeptnum 我需要访问那个空白。
  • 明白了。实际上,我在当天提出了一个关于这种方式的问题——read in bash on tab-delimited file without empty fields collapsinganswer by DigitalRoss 建议使用带有非空白分隔符的 tr 将在 /bin/sh 土地上为您工作,只要存在这样的分隔符(在您的数据中找不到)。

标签: shell sh


【解决方案1】:

awk,默认情况下,将其输入拆分为任意运行的空白,因此“空白”不会成为输入字段之一,除非您将字段分隔符更改为 完全一个标签。

middlename=$(awk 'BEGIN {FS="\t"} {print $2}')

然后,如前所述,您需要引用参数扩展以避免该值被丢弃。

if test "$middlename" = " "; then
    echo "yes"
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 2016-01-09
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多