我在处理某些文件时遇到问题。我需要为文件中的每一行执行列计数,并根据我需要在每行末尾添加几个','的列数。所有行应有36列,以','
分隔此行解决了我的问题,但如何以自动方式在包含多个文件的文件夹中运行它?
awk ' BEGIN { FS = "," } ;
{if (NF == 32) { print $0",,,," } else if (NF==31) { print $0",,,,," }
}' <SOURCE_FILE> > <DESTINATION_FILE>
感谢您的支持 的R&amp; P
答案 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)' *