开发者

How to "do something" for each input text files

Say that I read in the following information stored in three diffrent text files (Can be many more)

File 1

1 2 rt 45
2 3 er 44

File 2

rf r 4 5
3 er 4 t
er t yu 4

File 3

er tyu 3er 3r
der 4r 5e
edr rty tyu 4r
edr 5t yt5 45

When I read in this information I want it to print this information from these two files into separate arrays as for now they are printed out in the same time

Now I Have this script printing out all information at the same time

{
    TESTd[NR-1] = $2; g++
}   
END {           
   for (i = 0 ; i <= g-1; i ++ ) {
        print "            [\"" TESTd[i] "\"]"

     }
     print "            _____"
}

But is there a way to read in multiple files and do this for every text file? Like instead of getting this output when doing awk -f test.awk 1.txt 2.txt 3.txt

    ["2"]
    ["3"]
    ["r"]
    ["er"]
    ["t"]
    ["tyu"]
    ["4r"]
    ["rty"]
    ["5t"]
    _____

I get this output

    ["2"]
    ["3"]
    _____
    ["r"]
    ["er"]
    ["t"]
    _____
    ["tyu"]
    ["4r"]
    ["rty"]
    ["5t"]
    _____

And reading in each file at the time is preferably not an option here since I will have like 30 text files.

EDIT________________________________________________________________

I want to do this in awk if possible because I'm going to do something like this

{
    PRINTONCE[NR-1] = $2; g++
    PRINTONEATTIME[NR-1] = $3
}
END { 
            #Do this for all arguments once
        for (i = 0 ; i <= g-1; i ++ ) {
             print "            [\"" PRINTONCE[i] "\"] \n"
        }
        print "            _____"
            #Do this for loop for every .txt file that is read in as an argument
              #for(j=0;j<开发者_如何转开发args.length;j++){
        for (i = 0 ; i <= g-1; i ++ ) {
             print "            [\"" PRINTONEATTIME[i] "\"] \n"
        }
        print "            _____"
}


From what i understand, you have an awk script that works and you want to run that awk script on many files and want their output to have a new line(or _) in between so you can distinguish which output is from which file.

Try this bash script :-

dir=~/*.txt #all txt files in ~(home) directory
for f in $dir
do
    echo "File is $f"
    awk 'BEGIN{print "Hello"}' $f #your awk code will take $f file as input.
    echo "------------------"; echo;
done

Also, if you do not want to do this to all files you can write the for loop as for f in 1.txt 2.txt 3.txt.


If you don't want to do it in awk directly. You can call it like this in bash or zsh for example:

for fic in test*.txt; awk -f test.awk $fic


It's quite simple to do it directly in awk:

# define a function to print out the array
function dump(array, n) {
    for (i = 0 ; i <= n-1; i ++ ) {
        print "            [\"" array[i] "\"]"
    }
    print "            _____"
}

# dump and reset when starting a new file
FNR==1 && NR!=1 {
    dump(TESTd, g)
    delete TESTd
    g = 0
}
# add data to the array
{
    TESTd[FNR-1] = $2; g++
}
# dump at the end
END {
    dump(TESTd, g)
}

N.B. using delete TESTd is a non-standard gawk feature, but the question is tagged as gawk so I assumed it's OK to use it.

Alternatively you could use one or more of ARGIND, ARGV, ARGC or FILENAME to distinguish the different files.

Or as suggested by see https://stackoverflow.com/a/10691259/981959, with gawk 4 you can use an ENDFILE group instead of END in your original:

{
    TESTd[FNR-1] = $2; g++
}
ENDFILE {
    for (i = 0 ; i <= g-1; i ++ ) {
        print "            [\"" TESTd[i] "\"]"
    }
    print "            _____"
    delete TESTd
    g = 0
}


Write a bash shell script or a basic shell script. Try to put below into test.sh. Then call /bin/sh test.sh or /bin/bash test.sh, see which one will work

for f in *.txt
do
  echo "File is $f"
  awk -F '\t' 'blah blah' $f >> output.txt
done

Or write a bash shell script to call your awk script

for f in *.txt
do
  echo "File is $f"
  /bin/sh yourscript.sh
done
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜