2017-02-17 1 views
1

루프 내에서 빌드하는 배열에서 TSV 파일을 만들려고합니다. 각 줄의 값을 탭 구분되도록 가져 오지 만 배열의 각 요소를 새 줄에 내보낼 수는 없습니다. 이 예는 다음과 같습니다bash - 새 줄에 각 배열 요소를 출력합니다.

OUTPUT=() 
#header 
OUTPUT+=$(printf "col_1\tcol_2\tcol_3") 

param_1="bla" 
param_2="tra" 
param_3="meh" 

for i in 1 .. 3 
    do 
    OUTPUT+=$(printf "$param_1\t$param_2\t$param_3") 
done 
#export 
printf '%s\n' "${OUTPUT[@]}" > test.tsv 

나는 또한 내가 배열에 삽입 각 문자열의 끝에서 \n을 넣어 시도했다, 그러나 그것은 작동하지 않았다. 내가 뭘 잘못하고 있는거야? 당신이

+1

이 파일에 끝날 것 경우, 중간 어레이 층을 할 필요가 없습니다, 당신은 직접 파일 요소를 작성할 수 있습니다. 비행 중 파일을 볼 수 없도록하려면 임시 파일을 사용하고 마지막에 최종 이름으로 이동할 수 있습니다. – karakfa

+1

네, 장래에 스크립팅을 사용하려는 경우, 이것은 파일에 쓰는 방법이 아닙니다 (그래도 가능합니다). 데이터 조작 (및 파일 읽기/쓰기)을 위해 설계된 도구를 학습하는 것이 더 좋습니다. [awk tutorial] (http://grymoire.com/Unix/awk.html)을 확인하거나 무제한 제어 및 시스템 기능, OO 등이 필요한 경우 Python 또는 Perl 자습서를 찾아보십시오. 행운을 빕니다. – shellter

+0

@karakfa 임시 파일을 사용하지 않고 모든 반복마다 쓰기를하지 않을 것입니다. 왜 버퍼링 되더라도 출력은 절반 MB를 초과하지 않습니다. 마지막에 한 번만 출력 할 수 있습니다. 그렇습니까? 귀하의 의견에 대해 – Marius

답변

2

배열에 추가하려면 감사이 구문을 사용한다 :

array+=(content) 

또한 정적 텍스트를 추가하기위한 printf를 사용할 필요가 없다. 그래서 이스케이프 시퀀스가 ​​올바르게 해석 printf에서 %b

OUTPUT=() 
#header 
OUTPUT+=("col_1\tcol_2\tcol_3") 

param_1="bla" 
param_2="tra" 
param_3="meh" 

for i in {1..3} 
do 
    OUTPUT+=("$param_1\t$param_2\t$param_3") 
done 
#export 
printf '%b\n' "${OUTPUT[@]}" > test.tsv 

주 사용 : 여기

는 작업 스크립트입니다.

출력 :

cat test.tsv 

col_1 col_2 col_3 
bla  tra  meh 
bla  tra  meh 
bla  tra  meh 
+1

안녕하세요. 답변 해주셔서 감사합니다. 이제 작동합니다. 따라서 실제로 차이를 만드는 것은'printf' 파일에서 모든 이스케이프 문자를 확장하는 바이너리로의 변환 '% b'입니다. 배열에 요소를 추가하는 동안'printf'를 사용하지 않고 전에 시도했지만'\ t'로 모든 문자열을 인쇄합니다. 다시 한번 감사합니다 – Marius

관련 문제