如何检查文本文件是否在bash中将制表符作为分隔符?

时间:2014-08-06 19:07:19

标签: bash shell awk sed grep

所以我有一个文本文件,它可能有一个标签作为其字段分隔符(分隔符),或者它可能有一个空格作为字段分隔符。我想检查该文本文件是否列表,否则我将对该文件执行其他操作。我正在使用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

3 个答案:

答案 0 :(得分:4)

假设当文件以制表符分隔时,第一行上只有一个选项卡,那么

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 :(得分:0)

如果足以测试我们是否在第一行有一个标签,我就不用打电话给 awk

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

两个单引号之间的“空格”用Ctrl-V表示,然后按Tab键。

答案 2 :(得分:0)

以上解决方案仅检查某处是否有标签,而不是文件格式正确,即每行有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
相关问题