user2820879
user2820879

Reputation: 39

Make some replacements on a bunch of files depending the number of columns per line

I'm having a problem dealing with some files. I need to perform a column count for every line in a file and depending the number of columns i need to add severals ',' in in the end of each line. All lines should have 36 columns separated by ','

This line solves my problem, but how do I run it in a folder with several files in a automated way?

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

Thank you for all your support R&P

Upvotes: 1

Views: 57

Answers (3)

Ed Morton
Ed Morton

Reputation: 203229

The answer depends on your OS, which you haven't told us. On UNIX and assuming you want to modify each original file, it'd be:

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

Also, in general to get all records in a file to have the same number of fields you can do this without needing to specify what that number of fields is (though you can if appropriate):

$ 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,,,,,

Upvotes: 1

uml&#228;ute
uml&#228;ute

Reputation: 31274

if this is only a single folder without subfolders, use:

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

if you also want to include subdirectories recursively, it's probably easiest to put the awk+redirection into a small shell-script, like this:

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

and then run this script (let's calls it runawk.sh) via find:

find /path/to/files/ -type f -not -name "*.new" -exec runawk.sh \{\} \;

Upvotes: 0

glenn jackman
glenn jackman

Reputation: 246764

It's a short one-liner with Perl:

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

Upvotes: 0

Related Questions