1

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

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

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

感谢大家对R&P的支持

4

3 回答 3

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,,,,,
于 2013-09-26T19:27:24.573 回答
0

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

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

如果您还想递归地包含子目录,将 awk+redirection 放入一个小的 shell 脚本中可能是最简单的,如下所示:

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

runawk.sh然后通过 find运行这个脚本(我们称之为):

find /path/to/files/ -type f -not -name "*.new" -exec runawk.sh \{\} \;
于 2013-09-26T19:26:23.697 回答
0

这是一个简短的 Perl 单行代码:

perl -i.bak -F, -alpe '$_ .= "," x (36-@F)' *
于 2013-09-26T19:27:32.353 回答