Bash - 파일, 배열 및 출력

Bash - 파일, 배열 및 출력

직원 이름, 부서, 직원이 위치한 도시가 포함된 파일이 있습니다. 예를 들면 다음과 같습니다.

John
IT
Chicago
Joshua
accounting
New York
Marcy
CEO
Los Angeles
... 

이 파일을 다음 형식으로 변환해야 합니다.

John?IT?Chicago
Joshua?accounting?New York
Marcy?CEO?Los Angeles

필드 구분 기호로 물음표 사용

지금까지 나는 다음 bash 스크립트를 완성했습니다.

fname="mix.txt"
exec<$fname

index=0
while read line ; do
        ARRAYLINES[$index]="$line"
        index=$(($index+1))
done < $fname

NUMBERLINES=$(grep -c "" $fname)
NUMBERLOOP=$(($NUMBERLINES/3))


count=0

for i in $(eval echo {1..$NUMBERLOOP})
do
  one=$(($count+1))
  two=$(($count+2))

  LINE0=${ARRAYLINES[$count]}
  LINE1=${ARRAYLINES[$one]}
  LINE2=${ARRAYLINES[$two]}
  ((count + 3))

  FINAL="$LINE0?$LINE1?$LINE2"
  echo $FINAL >> final.txt
done

최종 파일의 행 개수는 정확하지만 모든 행은 첫 번째 직원 데이터와 동일합니다.

John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago

어떤 단서가 있나요?

답변1

평소에는 "실제로는 이렇게 해야 합니다"라는 답변을 게시하는 것을 좋아하지 않지만 누군가는이미 해결됨귀하의 스크립트에 버그가 있어서 멈출 수가 없습니다. 이 방법으로는 너무 어렵게 만들고 있습니다. sed와 같은 도구를 사용하면 이 작업을 더 쉽게 수행할 수 있습니다 awk. 예를 들면 다음과 같습니다 sed.

$ sed 'N; N; s/\n/?/g' /path/to/your/file

이는 세 줄(하나는 기본, 다른 두 개는 N; N;) 을 읽고 s/\n/?/g줄 바꿈을 물음표( )로 바꿉니다. 파일의 변환된 버전이 출력됩니다. 콘텐츠를 그 자리에서 바꾸려면 이 -i플래그를 사용하세요.

답변2

또 다른 방법은 다음과 같습니다 paste.

<infile paste -d '?' - - -

이렇게 하면 물음표를 구분 기호로 사용하여 한 번에 세 줄을 붙여넣습니다. 속도/빠른 처리가 필요하다면 이것이 바로 당신을 위한 것입니다. 게다가 만약에스티븐 차제라스' 지적, 파일을 그 자리에서 편집할 수도 있습니다.

답변3

그리고

(( count + 3 ))

$count에 3을 더하고 결과를 버리면 됩니다. 사용해 보세요

(( count = count + 3 ))

관련 정보