我有一个文件,其中包含多个列,|
如下所示。该文件约有 3000 万条记录。
文本日志
100001|2000001|1000|C_ER|200|20200525075521|20370101000000|20200525075521
100001|2000001|1000|C_TPT|800|20200525075521|20370101000000|20200525075521
100001|3000001|1000|C_CED|100|20200525080051|20370101000000|20200525080051
100001|3000001|1000|C_CSD|50|20200525080051|20370101000000|20200525080051
100001|3000001|1000|C_SIN|2000|20200525080051|20370101000000|20200525080051
100001|4000001|1000|C_CED|DATE|20200531070527|20370101000000|20200531070527
100001|4000001|1000|C_CSD|NUMB|20200531070527|20370101000000|20200531070527
100001|4000001|1000|C_SIN|20BIN|20200531070527|20370101000000|20200531070527
100001|4000001|1000|C_PON|192|20200531070527|20370101000000|20200531070527
如果第 2 列和第 3 列属于同一类别,我想将记录合并为 1 行。
这是输出:
输出
100001|2000001|1000|C_ER|200|C_TPT|800|20200525075521|20370101000000|20200525075521
100001|3000001|1000|C_CED|100|C_CSD|50|C_SIN|2000|20200525080051|20370101000000|20200525080051
100001|4000001|1000|C_CED|DATE|C_CSD|NUMB|C_SIN|20BIN|C_PON|192|20200531070527|20370101000000|20200531070527
我使用此代码来提取记录并对它们进行排序,但我无法将它们合并为同一记录类别的单行:
cat cbs_bc_offering_prop_all*|grep 100740000001755144|awk 'BEGIN { FS=OFS=SUBSEP="|"}{arr[$2,$3,$4,$6,$7,$8,$9,$12,$15] }END {for (i in arr) print i,arr[i]}'|sort -t'|' -k1,1 -k2,2 -k3,3
答案1
我确信我们可以让这个更干净,但是……让它发挥作用,完成它。
基本上,我们拆分字段并再次合并它们,希望它有所帮助!
#!/bin/awk -f
BEGIN {FS="|"; output_data=""; ofs="|"}
function data_splitter () {split($0,splited_data,"|")
header=splited_data[1] "|" splited_data[2] "|" splited_data[3]
data=splited_data[4] "|" splited_data[5]
tail=splited_data[NF-2] "|" splited_data[NF-1] "|" splited_data[NF]
}
function data_dump(reg1, reg2, reg3) {
output_header=reg1
output_data=output_data reg2 ofs
output_tail=reg3
}
#MAIN
NR==1{
data_splitter()
data_dump(header, data, tail)
next
}
{
if (splited_data[2]==$2){
data_splitter()
data_dump(header, data, tail)}
else{
print output_header ofs output_data output_tail
output_data=""
data_splitter()
data_dump(header, data, tail)
}
}
END{
print output_header ofs output_data output_tail
}