大家好,我有制表符分隔的文件,如下所示
输入文件
6 12312321 123213 123321
8 afddsf askakf asfds
4 fsdaofs safjsdf kasdbfksdj
4 safndsj skfkds sfsjl
4 skjfs akjsfk kjdsafk
9 asnfkjds kjsdksd ksafnd
7 12321321 124124 124124
6 78787878 984929 29232
8 afddsf askakf asfds
4 fsdaofs safjsdf kasdbfksdj
4 safndsj skfkds sfsjl
4 skjfs akjsfk kjdsafk
9 asnfkjds kjsdksd ksafn
7 78787878 233232 242214
预期输出 1:file1.txt - 根据第一列中的 6 和 7 值分割第一组
6 12312321 123213 123321
8 afddsf askakf asfds
4 fsdaofs safjsdf kasdbfksdj
4 safndsj skfkds sfsjl
4 skjfs akjsfk kjdsafk
9 asnfkjds kjsdksd ksafnd
7 12321321 124124 124124
预期输出 2:file2.txt
6 78787878 984929 29232
8 afddsf askakf asfds
4 fsdaofs safjsdf kasdbfksdj
4 safndsj skfkds sfsjl
4 skjfs akjsfk kjdsafk
9 asnfkjds kjsdksd ksafn
7 78787878 233232 242214
预期输出 3:file3.txt - 根据第一列中的 8 和 9 值进行分割
8 afddsf askakf asfds
4 fsdaofs safjsdf kasdbfksdj
4 safndsj skfkds sfsjl
4 skjfs akjsfk kjdsafk
9 asnfkjds kjsdksd ksafnd
预期输出 4:file4.txt
8 afddsf askakf asfds
4 fsdaofs safjsdf kasdbfksdj
4 safndsj skfkds sfsjl
4 skjfs akjsfk kjdsafk
9 asnfkjds kjsdksd ksafn
最佳答案
这个问题很复杂,因为在处理完整个文件之前,我们不知道如何创建具有正确索引的文件名。
#! /usr/bin/awk -f
BEGIN {
FS = "\t"
split("", b67)
split("", b89)
i67 = i89 = 0
}
(i67 in b67) { b67[i67] = b67[i67] ORS $0 }
(i67 in b67) && $1 == 7 { ++i67 }
!(i67 in b67) && $1 == 6 { b67[i67] = $0 }
(i89 in b89) { b89[i89] = b89[i89] ORS $0 }
(i89 in b89) && $1 == 9 { ++i89 }
!(i89 in b89) && $1 == 8 { b89[i89] = $0 }
END {
f = 0
for (i = 0; i < i67; ++i)
print b67[i] > "file" ++f ".txt"
for (i = 0; i < i89; ++i)
print b89[i] > "file" ++f ".txt"
}
in
模式周围有一些 ()
,这些并不是必需的,但放置它们是为了增加清晰度。
关于linux - 从文本文件中分割记录 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49662739/