각 줄의 끝에 쉼표를 추가하는 방법(큰따옴표로 묶인 텍스트의 쉼표를 무시하고 줄의 개수를 기준으로 함)?

각 줄의 끝에 쉼표를 추가하는 방법(큰따옴표로 묶인 텍스트의 쉼표를 무시하고 줄의 개수를 기준으로 함)?

아래는 데이터 샘플입니다.

내가 달성하고 싶은 것은 각 줄의 쉼표 수를 세어야 한다는 것입니다(또한 큰따옴표("")로 묶인 문자열의 쉼표를 무시해야 합니다). 쉼표 개수가 특정 숫자보다 적으면 남은 쉼표 개수를 더해야 합니다. 예를 들어. 줄당 총 쉼표 수는 50개여야 합니다. 한 줄에 18개의 쉼표가 있으면 나머지 32개의 쉼표를 줄 끝에 추가해야 합니다. 또한 큰따옴표("")로 묶인 문자열의 쉼표를 무시해야 합니다.

[20/07/2016 23:56:13.412],1502740051,2,501,"[2]",8,TL_mostPlayedVOD_15_days,
[20/07/2016 23:56:13.412],1502740051,2,501,"[2]",8,TL_mostPlayedVOD_15_days,,2,1645981,"you, me and he",1461742773000
[04/10/2016 01:30:30.789],1502702627,2,501,"[2]",8,TL_mostPlayedVOD_15_days,,2,1967748,"sex and the city",1414665744000,1512143880000,NAM20141030102723000,2,3967956,"the big bang theory",1469531668000,1492185539000,NAM20160726104146000,2,6399683,"abang bomba ,i love you",1473865200000,1491148680000,NAM20160914094137000,2,6226697,"super spontan superstar",1471068000000,1491321540000,NAM20160813044535000,2,6579649,"lara aishah",1474887600000,1499702340000,NAM20160925025431000,2,6671628,"konsert af 2016",1474869600000,1491494160000,NAM20160928025259000,
[04/10/2016 01:30:30.789],1502702627,2,501,"[2]",8,TL_mostPlayedVOD_15_days,,2,1967748,"sex and the city",1414665744000,1512143880000,NAM20141030102723000,2,3967956,"the big bang theory",1469531668000,1492185539000,NAM20160726104146000,2,6399683,"abang bomba i love you",1473865200000,1491148680000,NAM20160914094137000,2,6226697,"super spontan,superstar",1471068000000,1491321540000,NAM20160813044535000

답변1

소중한 의견과 제안을 보내주신 모든 분들께 감사드립니다. 방금 더 간단한 해결책을 찾았습니다.

#!/bin/bash

FILE='/tmp/file.log'

cat $FILE | awk '{print $0",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"}' >> MODIFIED_FILE

while read line;

do

    echo $line | cut -d ',' -f1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 >> NEW_FILE

done < "MODIFIED_FILE"

답변2

다음은 문제를 해결할 수 있는 몇 가지 코드입니다 awk.sed

  1. 먼저 bash 배열을 만듭니다.

    array=()
    
  2. 배열의 각 요소는 따옴표로 묶인 요소를 제외하고 각 줄의 "," 개수로 채워집니다(줄이 따옴표로 시작하지 않는다고 가정).

    num=$(cat myData.txt | wc -l)
    for ((i=1; i <= $num; i++)); do array[$i]=$(cat myData.txt | awk 'BEGIN{FS="\""}{for (i=1; i <= NF; i=i+2) printf $i; print ""}' | sed 's/[^,]//g' | awk -v i=$i 'NR=i{printf length}'); done
    
  3. 줄당 최대 "," 수를 정의하고 마지막 awk 명령을 사용하여 이전에 구축한 배열을 사용하여 각 줄 끝에 ","의 올바른 수를 인쇄합니다.

    numMax=50
    awk -v array="${array[*]}" -v max=$numMax 'BEGIN{split(array,a," ")}{printf $0; for (i=a[NR]; i < max; i++) printf ","; print ""}' myData.txt > myProcessedData.txt
    

스크립트 형식의 전체 프로세스는 다음과 같습니다.

#!/bin/bash
array=()
numMax=50
num=$(cat myData.txt | wc -l)

for ((i=1; i <= $num; i++))
do 
    array[$i]=$(cat myData.txt | awk 'BEGIN{FS="\""}{for (i=1; i <= NF; i=i+2) printf $i; print ""}' | sed 's/[^,]//g' | awk -v i=$i 'NR=i{printf length}')
done

awk -v array="${array[*]}" -v max=$numMax 'BEGIN{split(array,a," ")}{printf $0; for (i=a[NR]; i < max; i++) printf ","; print ""}' myData.txt > myProcessedData.txt

관련 정보