숫자도 포함된 일부 텍스트 파일을 처리하기 위해 bash에서 스크립트를 작성하고 있습니다. 숫자로 채워진 45개의 위치가 있는 배열 변수를 만들었습니다. 5개의 필드/열과 45개의 행이 있는 이 텍스트 파일(구분자는 실제로 쉼표가 아닌 "|"임)이 있습니다. 여섯 번째 열을 추가하고 쓰고 싶습니다.N각 배열의 첫 번째 값N파일의 3번째 줄.
내 원본 텍스트 파일에는 다음이 포함됩니다.
61537000|COO|DI|VMD|2018-01-08 00:00:00
61537000|COO|DI|VMD|2018-01-09 00:00:00
61537000|COO|DI|VMD|2018-01-10 00:00:00
61537000|COO|DI|VMD|2018-01-11 00:00:00
61537000|COO|DI|VMD|2018-01-12 00:00:00
...
61537000|COO|DI|VMD|2018-02-21 00:00:00
내 배열 변수는 다음과 같이 저장 됩니다 qy
.echo ${qy[*]}
133.7545755174117347 197.5730453102068415 211.0612457141076671 195.3965252988823307 155.9141492798344956 122.0765862336716795 109.3807402580878840 100.1258594727256394 118.3713165600757955 129.9118732920391577 130.2183465952591614 108.3783455600275339 87.3744866455706415 74.6811189513075407 67.2786196847537834 66.6486466128231307 75.5263825809798786 79.7579752859345201 76.7748478701627372 75.7971233334776102 75.5218971041520397 74.3644957571369167 74.7302279790034398 82.9013111977886133 107.8462461297641418 109.3922469923296476 87.2584880672884534 74.3278359110118687 66.8273524401225775 62.9054376472748469 59.2471567250619217 55.4465232890134493 54.9324477319027615 55.0268189192084034 50.3969437024658000 48.2808157236208981 49.8788627643603767 50.7025436995365588 52.5391775713757207 51.6024683921895763 66.5341261816728136 73.3342955766798011 68.3585064456764055 69.1125302235501069 75.0594939607898664
필수 출력 파일:
61537000|COO|DI|VMD|2018-01-08 00:00:00|133.75
61537000|COO|DI|VMD|2018-01-09 00:00:00|197.57
61537000|COO|DI|VMD|2018-01-10 00:00:00|211.06
61537000|COO|DI|VMD|2018-01-11 00:00:00|195.39
61537000|COO|DI|VMD|2018-01-12 00:00:00|155.91
...
61537000|COO|DI|VMD|2018-02-21 00:00:00|122.07
성공적으로 while read line do; ... done < file
사용했습니다cut -d '|' -f6
읽다하지만 분명히 다음 과 같은 while write
직접적인 루프 는 없습니다.쓰다거기에 어떤 것이 있나요? 어떤 도움이라도 대단히 감사하겠습니다.
답변1
순수한 bash
법. 요소의 개수 $qy
와 행의 개수가 같기 때문에문서, for
루프는 다음을 사용하여 작동해야 합니다.read
~에주기:
for f in ${qy[*]}; do read x; printf '%s|%.2f\n' "$x" "$f"; done < file
어떤 이유로 printf
든 표시되지 않으면 다음을 echo
사용하여 수행할 수 있습니다.매개변수 대체:
for f in ${qy[*]}; do read x; echo "$x|${f%%??????????????}"; done < file
답변2
좋은 것들이 있습니다 paste
:
printf '%.2f\n' "${qy[@]}" | paste -d'|' textfile -
61537000|COO|DI|VMD|2018-01-08 00:00:00|133.75
61537000|COO|DI|VMD|2018-01-09 00:00:00|197.57
61537000|COO|DI|VMD|2018-01-10 00:00:00|211.06
61537000|COO|DI|VMD|2018-01-11 00:00:00|195.40
61537000|COO|DI|VMD|2018-01-12 00:00:00|155.91
(간결하게 하기 위해 처음 5개 항목만 복사했습니다.)
답변3
1 단계
sed -r "s/\s+$//g" orgial_textfile| awk '{print $0"|"}' >>orginal_final_textfile
2 단계
need_copy_textfile에 배열 변수 저장
sample need_copy_textfile format will be
133.7545755174117347
197.5730453102068415
211.0612457141076671
195.3965252988823307
155.9141492798344956
122.0765862336716795
109.3807402580878840
100.1258594727256394
118.3713165600757955
129.9118732920391577
130.2183465952591614
108.3783455600275339
87.3744866455706415
.
.
.
75.0594939607898664
awk '{print substr($1,1,6)}' need_copy_textfile >> need_copy_textfile_final.txt
3단계
이제 위의 두 파일을 결합하여 원하는 결과를 얻으십시오.
paste orginal_final_textfile need_copy_textfile_final.txt | sed -r "s/\t+//g"
샘플 출력
61537000|COO|DI|VMD|2018-01-08 00:00:00|133.75
61537000|COO|DI|VMD|2018-01-09 00:00:00|197.57
61537000|COO|DI|VMD|2018-01-10 00:00:00|211.06
61537000|COO|DI|VMD|2018-01-11 00:00:00|195.39
61537000|COO|DI|VMD|2018-01-12 00:00:00|155.91