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)
任何线索?
通常我不喜欢发布“实际上你应该这样做”的答案,但有人已经解决了你脚本中的错误,我无法阻止自己——你这样做太难了。使用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
标志