2014-03-13 2 views
2

쉼표로 여러 단어를 포함하는 파일이 있습니다. 나는 파일을 읽고이 단어들을 배열에 저장하고 싶다. 이 파일에서 첫 번째 줄은 머리글이고 다른 줄은 데이텀입니다. 그러나 일부 데이텀은 null입니다. 따라서이 null 문자는 0이어야합니다. 예를 들면 다음과 같습니다.파일 bash를 읽는 동안 단어를 배열로 저장

H1;H2;H3;H4 
12;23;33;44 
44;;7;8 
13;;;9 

그래서 내가 먼저 줄을 건너 뛰려면 4 배열에 자료를 넣어 =>

H1 array= 12;44;13 
H2 array= 23;0;0 
H3 array= 33;7;0 
H4 array= 44;8;9 

그래서 내 코드가 같다 : 그래서

array=() 
awk 'NR>1' $filename2 | while read line 
do 
    cntr=0 
    IFS=";" 
    for i in $line; do 
     if [ -z $i ]; then array[cntr]=0; 
      else array[cntr]=$i; 
     fi 
    cntr=$[$cntr +1] 
    done 
    h1array+=("${array[0]}") 
    h2array+=("${array[1]}") 
    h3array+=("${array[2]}") 
    h4array+=("${array[3]}") 
done 
for ((i=0;i<3;i++)); do 
    echo "${h1array[$i]}" 
done 
for ((i=0;i<3;i++)); do 
    echo "${h2array[$i]}" 
done 
for ((i=0;i<3;i++)); do 
    echo "${h3array[$i]}" 
done 
for ((i=0;i<3;i++)); do 
    echo "${h4array[$i]}" 
done 

, 그것은 터미널에서 널 (null) 인쇄 . 어떻게해야합니까? 고마워요

+0

그래서 실제로 * 수행 할 작업은 빈 레코드를 '0'으로 채우는 것입니다. –

+0

예,이 값을 0으로 배열에 추가 – lowcosthighperformance

+0

배열을 만들 필요가 없습니다. bash도 필요 없다. awk의 한 줄에서이 작업을 수행 할 수있다. 당신이 정말로 이루고자하는 것은 무엇입니까 (당신이 해결하려고하는 문제)? –

답변

3

이것은 당신이 무엇입니까?

#!/bin/bash 

while read -r line; do 
     [[ "${line}" == *';'* ]] || continue 
     IFS=';' read -r h1 h2 h3 h4 <<< "${line}" 
     h1array+=("${h1:-0}") 
     h2array+=("${h2:-0}") 
     h3array+=("${h3:-0}") 
     h4array+=("${h4:-0}") 
done < <(tail -n +2 input.txt) 

echo "h1array = ${h1array[@]}" 
echo "h2array = ${h2array[@]}" 
echo "h3array = ${h3array[@]}" 
echo "h4array = ${h4array[@]}" 

.

$ ./t.sh 
h1array = 12 44 13 
h2array = 23 0 0 
h3array = 33 7 0 
h4array = 44 8 9 
+2

을 사용하는 것이 좋습니다 :'awk 'NR> 1'$ filename2 | 읽기 '는 하위 쉘을 생성하고 배열은 하위 쉘에서 생성/채워집니다. – anishsane

+1

오케이, 파일 끝 부분에 공백을 넣었습니다. :) 고마워요. 그것은 지금 작동합니다. – lowcosthighperformance

+0

나는 단지';'를 포함하지 않는 행을 건너 뛰도록 솔루션을 수정했습니다. 더 강력합니다 :-) –

관련 문제