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 ))

您只需将 3 添加到 $count 并丢弃结果。尝试用

(( count = count + 3 ))

相关内容