1

假设我读到了存储在三个不同文本文件中的以下信息(可以更多)

文件 1

1 2 rt 45
2 3 er 44

文件 2

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

文件 3

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

当我读入此信息时,我希望它将这两个文件中的此信息打印到单独的数组中,因为现在它们会同时打印出来

现在我有这个脚本同时打印出所有信息

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

     }
     print "            _____"
}

但是有没有办法读取多个文件并为每个文本文件执行此操作?就像在执行 awk -f test.awk 1.txt 2.txt 3.txt时获取此输出一样

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

我得到这个输出

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

最好不要同时读取每个文件,因为我将拥有 30 个文本文件。

编辑_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _ _ __ _ __ _ __ _ __ _ __ _ __

如果可能的话,我想在 awk 中执行此操作,因为我要做这样的事情

{
    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 "            _____"
}
4

4 回答 4

1

据我了解,您有一个有效的 awk 脚本,并且您想在许多文件上运行该 awk 脚本,并希望它们的输出之间有一个新行(或_),以便您可以区分哪个输出来自哪个文件。

试试这个 bash 脚本:-

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

此外,如果您不想对所有文件执行此操作,您可以将 for 循环编写为for f in 1.txt 2.txt 3.txt.

于 2011-06-30T12:10:00.970 回答
0

直接在 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)
}

NB usingdelete TESTd是一个非标准的 gawk 功能,但问题被标记为 gawk 所以我认为可以使用它。

或者,您可以使用一个或多个ARGIND、或来区分不同的文件。ARGVARGCFILENAME

或者按照https://stackoverflow.com/a/10691259/981959的建议,使用 gawk 4,您可以使用ENDFILE组而不是END原始组:

{
    TESTd[FNR-1] = $2; g++
}
ENDFILE {
    for (i = 0 ; i <= g-1; i ++ ) {
        print "            [\"" TESTd[i] "\"]"
    }
    print "            _____"
    delete TESTd
    g = 0
}
于 2012-06-26T23:51:34.000 回答
0

如果您不想直接在 awk 中执行此操作。您可以在 bash 或 zsh 中这样调用它,例如:

for fic in test*.txt; awk -f test.awk $fic
于 2011-06-30T11:01:40.470 回答
-1

编写一个 bash shell 脚本或一个基本的 shell 脚本。尝试将以下内容放入 test.sh。然后调用 /bin/sh test.sh 或 /bin/bash test.sh,看看哪个能用

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

或者编写一个 bash shell 脚本来调用你的 awk 脚本

for f in *.txt
do
  echo "File is $f"
  /bin/sh yourscript.sh
done
于 2012-07-08T22:16:31.627 回答