根据每行的列数对一堆文件进行一些替换

时间:2013-09-26 19:20:50

标签: sed awk

我在处理某些文件时遇到问题。我需要为文件中的每一行执行列计数,并根据我需要在每行末尾添加几个','的列数。所有行应有36列,以','

分隔

此行解决了我的问题,但如何以自动方式在包含多个文件的文件夹中运行它?

awk ' BEGIN { FS = "," } ; 
{if (NF == 32) { print $0",,,," } else if (NF==31) { print $0",,,,," }
}' <SOURCE_FILE> > <DESTINATION_FILE>

感谢您的支持 的R&amp; P

3 个答案:

答案 0 :(得分:1)

答案取决于你的操作系统,你没有告诉我们。在UNIX上,假设您要修改每个原始文件,它将是:

for file in *
do
    awk '...' "$file" > tmp$$ && mv tmp$$ "$file"
done

此外,通常要使文件中的所有记录具有相同数量的字段,您可以执行此操作,而无需指定该字段数是多少(尽管您可以选择):

$ cat tst.awk        
BEGIN { FS=OFS=","; ARGV[ARGC++] = ARGV[ARGC-1] }
NR==FNR { nf = (NF > nf ? NF : nf); next }
{
    tail = sprintf("%*s",nf-NF,"")
    gsub(/ /,OFS,tail)
    print $0 tail
}
$ 
$ cat file           
a,b,c
a,b
a,b,c,d,e
$ 
$ awk -f tst.awk file
a,b,c,,
a,b,,,
a,b,c,d,e
$ 
$ awk -v nf=10 -f tst.awk file
a,b,c,,,,,,,
a,b,,,,,,,,
a,b,c,d,e,,,,,

答案 1 :(得分:0)

如果这只是没有子文件夹的单个文件夹,请使用:

for oldfile in /path/to/files/*
do
   newfile="${oldfile}.new"
   awk '...' "${oldfile}" > "${newfile}"
done

如果你还想以递归方式包含子目录,最好将awk +重定向放入一个小的shell脚本中,如下所示:

#!/bin/bash
oldfile=$1
newfile="${oldfile}.new"
awk '...' "${oldfile}" > "${newfile}"

然后通过find:

运行此脚本(让我们称之为runawk.sh
find /path/to/files/ -type f -not -name "*.new" -exec runawk.sh \{\} \;

答案 2 :(得分:0)

Perl是一个简短的单行程序:

perl -i.bak -F, -alpe '$_ .= "," x (36-@F)' *
相关问题