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

これは3行(1つの基本、もう2つはN; N;)を読み、改行s/\n/?/gを疑問符()に置き換えます。ファイルの変換されたバージョンが出力されます。コンテンツをその場で置き換えるには、この-iフラグを使用してください。

答え2

別の方法は次のとおりですpaste

<infile paste -d '?' - - -

これにより、疑問符を区切り文字として使用して、一度に3行を貼り付けます。速度/高速処理が必要な場合は、これがあなたのためです。さらに、もしスティーブン・チャジェラス'指摘、ファイルをその場で編集することもできます。

答え3

そして

(( count + 3 ))

$countに3を加えて結果を捨てるだけです。試してみてください

(( count = count + 3 ))

関連情報