【问题标题】:How do you check if a text file had tab as its delimiter in bash?如何检查文本文件是否在 bash 中以制表符作为分隔符?
【发布时间】:2015-03-20 01:17:20
【问题描述】:

所以我有一个文本文件,它可能有一个制表符作为其字段分隔符(分隔符),或者它可能有一个空格作为字段分隔符。我想检查该文本文件是否已制成表格,否则我将对该文件执行其他操作。我正在使用 bash 脚本。所以我对纯 bash、sed、awk、grep 等的任何东西都持开放态度(注意:它们都是 GNU)。所以我正在考虑这样的结构:

if [if delimiter is tab]; then
    #do soemthing
elif [if delimiter is space]; then
    #do something else
fi

有什么建议吗?让我知道是否需要进一步解释。谢谢!

以下是对文本文件外观的更新说明:

如果文本文件有一个制表符作为分隔符,则它在每一行上分隔。如果文本文件有一个空格作为分隔符,那么它不是每行分隔的。

以下是我可能遇到的可能的文本文件示例:

分隔符是制表符

col1   col2   col3
-------
1   2   3
4   5   6

分隔符是空格:(空格在12到3 && 4到56之间)

col1col2col3
-----------
12 3
4 56

【问题讨论】:

  • 文件是否在每一行分隔? (你能保证第一行会被分隔吗?)空格分隔的文件中是否有任何制表符?制表符分隔的文件中是否有空格?
  • @EtanReisner 感谢您的关注。如果文本文件有一个制表符作为分隔符,那么它会在每一行上分隔。如果文本文件有一个空格作为分隔符,则不是每一行都分隔。

标签: bash shell awk sed grep


【解决方案1】:

当文件以制表符分隔时,假设一个制表符仅存在于第一行,那么这个

if awk '{exit !/\t/}' "$file"; then
    : # tab file
else
    : # space file
fi

应该做你想做的。

还有:

if [ -n "$(sed -n '/\t/p;q' "$file")" ]; then
    : # tab file
else
    : # space file
fi

【讨论】:

  • 感谢您的回答! +1。但我收到syntax error: unexpected end of file。关于为什么的任何想法?
  • @Alias 到底是什么代码? if 的每个块中都需要一些非评论内容,所以我写的内容不合法。编辑来解决这个问题。
  • 我在您发布的两个代码段的if 语句中遇到错误。我在 if 语句中也有 echo 语句而不是 cmets
  • FWIW awk '{exit !/\t/}' file 会完成这项工作。
  • @EdMorton 我认为这可能是可能的,但不确定,出于某种原因,没有对其进行测试。
【解决方案2】:

上述解决方案只检查某处是否有制表符,而不是检查文件格式是否正确,即每行有 3 个制表符分隔的列。

我会使用类似下面的东西,它会检查每行是否有正确数量的制表符:

no_cols=3
no_lines=$(cat "${file}" | wc -l)
no_tab_lines=$(cat "${file}" | cut -f${no_cols} | sed '/^$/d' | wc -l)
if [[ ${no_lines} -eq ${no_tab_lines} ]]; then
    echo "tabs"
else
    echo "not all tabs"
fi

【讨论】:

    【解决方案3】:

    如果测试第一行是否有选项卡就足够了,我会不调用 awk

    if `head -1 $file | grep -q '   '`; then
        : # tab file
    else
        : # space file
    fi
    

    两个单引号之间的“空格”是用 Ctrl-V 然后按 Tab 键组成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2013-09-14
      • 2016-01-09
      • 2022-11-02
      • 2011-04-17
      相关资源
      最近更新 更多