|
以下に示すように、複数の列を含むファイルがあります。ファイルには約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
}