使用shell脚本处理处理制表符分隔文件

时间:2010-05-06 12:23:56

标签: bash shell scripting sed awk

通常我会使用Python / Perl进行此过程,但我发现自己(出于政治原因)不得不使用bash shell来解决此问题。

我有一个大的制表符分隔文件,其中包含六列,第二列是整数。我需要shell脚本一个解决方案,它将验证文件确实是六列,第二列确实是整数。我假设我需要在某处使用sed / awk。问题是我对sed / awk并不熟悉。任何建议将不胜感激。

非常感谢! 莉莉

4 个答案:

答案 0 :(得分:3)

GAWK:

BEGIN {
  FS="\t"
}

(NF != 6) || ($2 != int($2)) {
  exit 1
}

调用如下:

if awk -f colcheck.awk somefile
then
  # is valid
else
  # is not valid
fi

答案 1 :(得分:2)

您可以直接告诉awk字段分隔符是什么(-F选项)。在awk脚本中,您可以通过NF变量告知每条记录中有多少个字段。

哦,你可以用正则表达式检查第二个字段。整个事情看起来像这样:

awk < thefile -F\\t '
{ if (NF != 6 || $2 ~ /[^0123456789]/) print "Format error, line " NR; }
'

这可能很接近,但我需要检查正则表达式,因为Linux正则表达式语法变化是如此疯狂。 (编辑因为grrrr

答案 2 :(得分:2)

这是如何用awk

做的
awk 'NF!=6||$2+0!=$2{print "error"}' file

答案 3 :(得分:2)

Pure Bash:

infile='column6.dat'
lno=0

while read -a line ; do
  ((lno++))
  if [ ${#line[@]} -ne 6 ] ; then
    echo -e "line $lno has ${#line[@]} elements"
  fi
  if ! [[  ${line[1]} =~ ^[0-9]+$ ]] ; then
    echo -e "line $lno column  2 : not an integer"
  fi
done < "$infile"

可能的输出:

line 19 has 5 elements
line 36 column  2 : not an integer
line 38 column  2 : not an integer
line 51 has 3 elements
相关问题