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