在多个输入文件上使用awk

时间:2015-03-13 00:32:33

标签: bash awk gawk

我曾经在这个脚本中工作过bash脚本,我一直试图弄清楚如何使用{{1}一次处理两个CSV文件},将用于生成多个输出文件。不久,有一个主文件可以将内容保存到一些其他输出文件中,这些文件的名称和需要保存的记录数将从另一个文件中派生出来。第一个awk记录将转到第一个输出文件,随后n转到n+1转到第二个,依此类推。

这里要更清楚一点,主要记录文件的外观如下:

n+k

以及其他文件的外观:

x11,x21
x12,x22
x13,x23
x14,x24
x15,x25
x16,x26
x17,x27
x18,x28
x19,x29

然后,名为out_file_name_1,2 out_file_name_2,3 out_file_name_3,4 的第一个输出文件应如下所示:

out_file_name_1

然后名为x11,x21 x12,x22 的第二个输出文件应如下所示:

out_file_name_2

最后一个应该是这样的:

x13,x23
x14,x24
x15,x25

希望它足够清楚。

2 个答案:

答案 0 :(得分:1)

这是awk的一个解决方案,因为你问过,但很明显三联的答案是更好的方法。

$ cat oak.awk
BEGIN { FS = ","; fidx = 1 }

# Processing files.txt, init parallel arrays with filename and number of records
# to print to each one.
NR == FNR {
    file[NR] = $1
    records[NR] = $2
    next
}

# Processing main.txt. Print record to current file. Decrement number of records to print,
# advancing to the next file when number of records to print reaches 0
fidx in file && records[fidx] > 0 {
    print > file[fidx]
    if (! --records[fidx]) ++fidx
    next
}

# If we get here, either we ran out of files before reading all the records
# or a file was specified to contain zero records    
{ print "Error: Insufficient number of files or file with non-positive number of records"
  exit 1 }


$ cat files.txt
out_file_name_1,2
out_file_name_2,3
out_file_name_3,4

$ cat main.txt
x11,x21
x12,x22
x13,x23
x14,x24
x15,x25
x16,x26
x17,x27
x18,x28
x19,x29

$ awk -f oak.awk files.txt main.txt

$ cat out_file_name_1
x11,x21
x12,x22

$ cat out_file_name_2
x13,x23
x14,x24
x15,x25

$ cat out_file_name_3
x16,x26
x17,x27
x18,x28
x19,x29

答案 1 :(得分:1)

我不会为此使用Awk。

while IFS=, read -u 3 filename lines; do
    head -n "$lines" >"$filename"
done 3<other.csv <main.csv

我认为,从特定文件描述符中读取的read -u并非完全可移植,但您的问题标记为,所以我假设这不是问题。

演示:http://ideone.com/6FisHT

如果您在第一个文件之后最终得到空文件,可能会尝试使用其他read语句替换内部循环。

while IFS=, read -u 3 filename lines; do
    for i in $(seq 1 "$lines"); do
        read -r line
        echo "$line"
    done >"$filename"
done 3<other.csv <main.csv