我有一个文件,其中包含员工姓名、部门和员工所在的城市,例如:
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 ))