Bash 检查文件是否具有给定的列数

Bash 检查文件是否具有给定的列数,bash,shell,csv,awk,delimited-text,Bash,Shell,Csv,Awk,Delimited Text,如果文件中的列数为4,则需要处理一些csv文件 文件1: 1,aa,bb,cc 2,dd,ee,ff 3,gg,hh,ii 文件2: 1,xx 2,yy 3,zz 4,xy 我用awk来做这个 for file in file_1 file_2 ... file_n do if [[ `awk -F"," 'NF==4' $file` ]] then #process else continue fi done 我正在寻找一个

如果文件中的列数为4,则需要处理一些csv文件

文件1:

1,aa,bb,cc
2,dd,ee,ff
3,gg,hh,ii
文件2:

1,xx
2,yy
3,zz
4,xy
我用awk来做这个

for file in file_1 file_2 ... file_n
do
    if [[ `awk -F"," 'NF==4' $file` ]]
    then
        #process
    else
        continue
    fi
done
我正在寻找一个解决方案

  • 不涉及子shell
  • 检查整个文件中的列数
  • 性能优于上述代码(如果可能)
解决方案一:如果您想检查任何一行是否没有4个字段并移动到下一个文件,那么下面的内容可能会对您有所帮助

awk -F, 'NF!=4{nextfile} 1' File_*
awk -F, 'NF!=4{next} 1' File_*
解决方案2:如果您只想跳过没有4个字段的行,那么下面的内容可能会对您有所帮助

awk -F, 'NF!=4{nextfile} 1' File_*
awk -F, 'NF!=4{next} 1' File_*
您可以使用:

for f in file_1 file_2 file_n; do
   if awk -F, 'NF!=4{exit 1}' "$f"; then
      echo "good $f"
   else
      echo "bad $f"
   fi
done

这个
awk
一旦找到列数不等于
4的记录,就会以
1
退出
awk

我不得不复制它,在第二次搜索时找到了一个精确的副本@在印度,我的搜索技能没有你想象的那么好;)@anubhava您的代码不适用于blankfiles@Nitesh:空文件没有
num\u列的记录!=4
因此它被认为是一个很好的案例。如果你想改变这一点,那么将
awk
行替换为
[[-s$f]]&&awk-f,'NF=4{exit 1}'“$f”
如果我将这些条件放入if,这些条件将返回所有有4列的行,并忽略其他行。。但在其他情况下它们是有用的