Bash - 文件、数组和输出

Duc*_*uck 4 bash text-processing files

我有一个包含员工姓名、部门和员工所在城市的文件,例如:

John
IT
Chicago
Joshua
accounting
New York
Marcy
CEO
Los Angeles
... 
Run Code Online (Sandbox Code Playgroud)

我必须将此文件转换为这种格式:

John?IT?Chicago
Joshua?accounting?New York
Marcy?CEO?Los Angeles
Run Code Online (Sandbox Code Playgroud)

使用问号作为字段分隔符

到目前为止,我已经完成了这个 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
Run Code Online (Sandbox Code Playgroud)

最终文件具有正确的行数,但所有行都等于第一个员工数据,例如

John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
Run Code Online (Sandbox Code Playgroud)

任何线索?

Mic*_*zek 7

通常我不喜欢发布“实际上你应该这样做”的答案,但有人已经解决了你脚本中的错误,我无法阻止自己——你这样做太难了。使用sed或 之类的工具会容易得多awk。例如,在sed

$ sed 'N; N; s/\n/?/g' /path/to/your/file
Run Code Online (Sandbox Code Playgroud)

这会读取三行(默认情况下为一行,由于 ,另外两N; N;行),并用问号 ( s/\n/?/g)替换换行符。它将输出文件的转换版本;如果要就地替换内容,请使用-i标志