考虑下面的输入文件。输入文件:
C1|C2|C3|C4|C5|C6
0|1|2|3|0-1-2-3|4
0|2|2|4|0-1-2-3|5
0|1|2|3|1-3-2-4|4
0|1|2|3|1-1-3-4|4
0|1|2|3|1-1-3-4|5
0|1|2|3|4-5-2-6|4
0|1|2|3|4-5-2-6|6
0|4|5|3|7-4-2-4|4
0|1|2|3|7-4-2-5|4
0|1|2|3|7-4-2-5|5
0|1|2|3|7-4-2-5|6
0|1|2|3|7-5-2-6|5
基于字段 5,例如第一条记录中的 0-1-2-3,输出分割文件预计如下分割文件 1:
C1|C2|C3|C4|C5|C6
0|1|2|3|0-1-2-3|4
0|2|2|4|0-1-2-3|5
0|1|2|3|1-3-2-4|4
0|1|2|3|1-1-3-4|4
0|1|2|3|1-1-3-4|5
分割文件2:
C1|C2|C3|C4|C5|C6
0|1|2|3|4-5-2-6|4
0|1|2|3|4-5-2-6|6
0|4|5|3|7-4-2-4|4
0|1|2|3|7-4-2-5|4
0|1|2|3|7-4-2-5|5
0|1|2|3|7-4-2-5|6
分割文件3:
C1|C2|C3|C4|C5|C6
0|1|2|3|7-5-2-6|5
基于第 5 列,对于该列中的每 3 个唯一值,文件应该被拆分,甚至应该包含重复第 5 列的值的所有行。有人可以帮我弄这个吗?
答案1
awk 的工作。就像是:
awk -F'|' -v fileformat="/abc/output/file_%04d.txt" -v max=3 -v field=5 '
NR == 1 {header = $0; next}
! ($field in seen) {
seen[$field]
if (++n % max == 1) {
close(out)
out = sprintf(fileformat, ++f)
print header > out
}
}
{print > out}' < /abc/input/a.txt
答案2
awk解决方案:
awk -F'|' 'NR==1{ h=$0; f=0; c=1 }NR>1{
a[$5]; if(length(a)>3) { f=0;c++; delete a };
fn="file"c".txt"; if(!f) print h > fn; print > fn; f++
}' file
h=$0
-标头线f=0
- 指向将标题行打印到下一个新文件的时刻的标志c=1
- 文件名后缀(每个新文件递增)a[$5]
-a
具有第五个字段的唯一值的索引数组if(length(a)>3) { f=0;c++; delete a }
c++
-当连续 3 个唯一值时启动下一个新文件名 ( )。 (delete a
-从数组中删除所有项目a
)fn="file"c".txt"
- 当前文件名
查看结果:
for f in file[0-9]*.txt; do echo "$f"; cat "$f"; echo; done
输出:
file1.txt
C1|C2|C3|C4|C5|C6
0|1|2|3|0-1-2-3|4
0|2|2|4|0-1-2-3|5
0|1|2|3|1-3-2-4|4
0|1|2|3|1-1-3-4|4
0|1|2|3|1-1-3-4|5
file2.txt
C1|C2|C3|C4|C5|C6
0|1|2|3|4-5-2-6|4
0|1|2|3|4-5-2-6|6
0|4|5|3|7-4-2-4|4
0|1|2|3|7-4-2-5|4
0|1|2|3|7-4-2-5|5
0|1|2|3|7-4-2-5|6
file3.txt
C1|C2|C3|C4|C5|C6
0|1|2|3|7-5-2-6|5
答案3
#!/bin/bash
awk -F '|' '
function print_to_file(str) {
print str > "file_"file_num;
}
NR == 1 {header = $0;}
NR > 1 {
if(!buf) {
file_num = 1;
print_to_file(header);
}
if(buf != $5) {
buf = $5;
cnt++;
}
if(cnt > 3) {
cnt = 1;
file_num++;
print_to_file(header);
}
print_to_file($0);
}
' input.txt
输出:
$ tail -n +1 -- file_* # display content of all files with their filenames
==> file_1 <==
C1|C2|C3|C4|C5|C6
0|1|2|3|0-1-2-3|4
0|2|2|4|0-1-2-3|5
0|1|2|3|1-3-2-4|4
0|1|2|3|1-1-3-4|4
0|1|2|3|1-1-3-4|5
==> file_2 <==
C1|C2|C3|C4|C5|C6
0|1|2|3|4-5-2-6|4
0|1|2|3|4-5-2-6|6
0|4|5|3|7-4-2-4|4
0|1|2|3|7-4-2-5|4
0|1|2|3|7-4-2-5|5
0|1|2|3|7-4-2-5|6
==> file_3 <==
C1|C2|C3|C4|C5|C6
0|1|2|3|7-5-2-6|5