텍스트 로그

텍스트 로그

|아래와 같이 여러 열이 포함된 파일이 있습니다 . 파일에는 약 3천만 개의 레코드가 포함되어 있습니다.

텍스트 로그

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
}

관련 정보