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
과 열을 추가합니다.Pcode
ccode
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라는 것을 알고 있다고 가정합니다. 또한 awk
CSV는 지원되지 않으므로 "단순 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
개수를 미리 설정해야 합니다. 그렇지 않으면 결과 파일이 상당히 커질 것입니다...