쉘 스크립트를 사용하여 여러 레코드를 추가하여 파일에서 레코드를 1000회 또는 n회 복사합니다.

쉘 스크립트를 사용하여 여러 레코드를 추가하여 파일에서 레코드를 1000회 또는 n회 복사합니다.

abc.txt라는 파일에 다음과 같은 기록이 있습니다.

ID, date, timestamp, count, idcount, unit, code, Pcode, ccode, bid, vcode

12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds

더 많은 no를 생성하기 위해 유닉스 쉘 코드를 작성하고 싶습니다. 레코드를 기록하려면 열 ID, Pcode 및 ccode를 늘리고 나머지 열은 그대로 두십시오.

12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds

12345433,10-11-2011,11:11:12.555,0,0,XVC_AS,12,15,20,123454323,qweds

12345434,10-11-2011,11:11:12.555,0,0,XVC_AS,12,16,21,123454323,qweds

12345435,10-11-2011,11:11:12.555,0,0,XVC_AS,12,17,22,123454323,qweds

12345436,10-11-2011,11:11:12.555,0,0,XVC_AS,12,18,23,123454323,qweds

12345437,10-11-2011,11:11:12.555,0,0,XVC_AS,12,19,24,123454323,qweds
.
.
.
.
1000 times or n times

답변1

질문의 입력 및 출력에 빈 줄이 실제로 존재하지 않는다고 가정합니다. 사용밀러( mlr), 먼저 헤더에 있는 추가 공백을 정리한 다음 $n개별 데이터 레코드의 복사본을 만듭니다. 그런 다음 이를 두 번째 Miller 호출에 전달하여 레코드를 업데이트하고 이름 ID과 열을 추가합니다.Pcodeccode

mlr --csv clean-whitespace then bootstrap -n "$n" file |
mlr --csv put '
    NR == 1 { @ID=$ID; @Pcode=$Pcode; @ccode=$ccode }
    NR > 1 {
        $ID    = @ID    + NR - 1;
        $Pcode = @Pcode + NR - 1;
        $ccode = @ccode + NR - 1;
    }'

질문의 데이터와 n=10셸의 데이터가 주어지면 다음이 출력됩니다.

ID,date,timestamp,count,idcount,unit,code,Pcode,ccode,bid,vcode
12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345433,10-11-2011,11:11:12.555,0,0,XVC_AS,12,15,20,123454323,qweds
12345434,10-11-2011,11:11:12.555,0,0,XVC_AS,12,16,21,123454323,qweds
12345435,10-11-2011,11:11:12.555,0,0,XVC_AS,12,17,22,123454323,qweds
12345436,10-11-2011,11:11:12.555,0,0,XVC_AS,12,18,23,123454323,qweds
12345437,10-11-2011,11:11:12.555,0,0,XVC_AS,12,19,24,123454323,qweds
12345438,10-11-2011,11:11:12.555,0,0,XVC_AS,12,20,25,123454323,qweds
12345439,10-11-2011,11:11:12.555,0,0,XVC_AS,12,21,26,123454323,qweds
12345440,10-11-2011,11:11:12.555,0,0,XVC_AS,12,22,27,123454323,qweds
12345441,10-11-2011,11:11:12.555,0,0,XVC_AS,12,23,28,123454323,qweds

헤더 삭제를 사용 awk하거나 무시하고 업데이트할 필드가 필드 1, 8, 9라는 것을 알고 있다고 가정합니다. 또한 awkCSV는 지원되지 않으므로 "단순 CSV" 데이터, 즉 쉼표나 줄 바꿈이 포함된 필드를 포함하지 않는 데이터를 다루고 있다고 가정해야 합니다.

awk -v n="$n" '
    BEGIN { OFS=FS="," }
    NR==1 { print; next }
    {
        for (i=1; i<=n; ++i) {
            print
            $1++; $8++; $9++
        }
    }' file

답변2

$ awk -v n=10 '
    BEGIN { FS=OFS="," }
    { print }
    NR > 1 { for (i=1; i<=n; i++) { $1++; $8++; $9++; print } }
' abc.txt
ID, date, timestamp, count, idcount, unit, code, Pcode, ccode, bid, vcode
12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345433,10-11-2011,11:11:12.555,0,0,XVC_AS,12,15,20,123454323,qweds
12345434,10-11-2011,11:11:12.555,0,0,XVC_AS,12,16,21,123454323,qweds
12345435,10-11-2011,11:11:12.555,0,0,XVC_AS,12,17,22,123454323,qweds
12345436,10-11-2011,11:11:12.555,0,0,XVC_AS,12,18,23,123454323,qweds
12345437,10-11-2011,11:11:12.555,0,0,XVC_AS,12,19,24,123454323,qweds
12345438,10-11-2011,11:11:12.555,0,0,XVC_AS,12,20,25,123454323,qweds
12345439,10-11-2011,11:11:12.555,0,0,XVC_AS,12,21,26,123454323,qweds
12345440,10-11-2011,11:11:12.555,0,0,XVC_AS,12,22,27,123454323,qweds
12345441,10-11-2011,11:11:12.555,0,0,XVC_AS,12,23,28,123454323,qweds
12345442,10-11-2011,11:11:12.555,0,0,XVC_AS,12,24,29,123454323,qweds

답변3

쉘이어야 합니까, 아니면 예를 들어 괜찮습니까 awk? 좋다

awk -F, -v"CNT=10" 'NR==1; NR==2 {for (;CNT--;) {print; $1++; $8++; $9++}}' OFS=, file
ID, date, timestamp, count, idcount, unit, code, Pcode, ccode, bid, vcode
12345432,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345433,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345434,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345435,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345436,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345437,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345438,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345439,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345440,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds
12345441,10-11-2011,11:11:12.555,0,0,XVC_AS,12,14,19,123454323,qweds

CNT는 print첫 번째 필드를 증가시켜 두 번째 행을 곱합니다.

쉘이어야한다면 시도해보십시오.

OLDIFS=$IFS
CNT=10
{ read LINE; echo $LINE; read LINE; } <file1
IFS=, ARR=($LINE)
while ((CNT--))
  do    ((ARR[0]++ + ARR[7]++ + ARR[8]++))
        echo "${ARR[*]}"
  done
IFS=$OLDIFS

개수를 미리 설정해야 합니다. 그렇지 않으면 결과 파일이 상당히 커질 것입니다...

관련 정보