テキストログ

テキストログ

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

関連情報