我有一个正在尝试修改的文本文件。我正在获取具有以下形式行的输入文件
(y+1/4,-x+1/2,z+3/4)
并试图将其更改为
0 1 0 -1 0 0 0 0 1 1 / 4 1 / 2 3 / 4
我目前可以做到这一点
0 1 0 1/4 -1 0 0 1/2 0 0 1 3/4
using
#!bin/bash
filename="227.dat"
sed -i 's/(/ /g' $filename
sed -i 's/)//g' $filename
sed -i 's/,/ /g' $filename
sed -i 's/-x/-1 0 0/g' $filename
sed -i 's/x/ 1 0 0/g' $filename
sed -i 's/-y/ 0 -1 0/g' $filename
sed -i 's/y/ 0 1 0/g' $filename
sed -i 's/-z/ 0 0 -1/g' $filename
sed -i 's/z/ 0 0 1/g' $filename
sed -i '/+/! s/$/ 0 \/ 1 0 \/ 1 0 \/ 1/' $filename
while ((i++)); read -r line; do
if [[ $line == *[+]* ]]
then
sed -i 's/+/ /g' $filename
echo $i
fi
done < "$filename"
echo $i 的原因是为了查看它是否正确给出了行号,我想也许我可以将它用于这些特定行上的命令。我正在进行此转换,因为我们用于创建晶体结构的代码需要末尾带有分数的矢量符号,而不是 x,y,z 符号。我已经知道这不是“最漂亮”或最简单的解决方案,但我对这一切都很陌生,这是我迄今为止能够拼凑出来的。有什么建议么?
这是一种可以简化解析的方法。使用 IFS 将每一行读入数组,设置为所有可能的分隔符和您不关心的字符:
while IFS=$'\(\)+,' read -ra line; do
for i in 1 3 5; do
case "${line[$i]}" in
x) printf "%s\t%s\t%s\t" 1 0 0 ;;
y) printf "%s\t%s\t%s\t" 0 1 0 ;;
z) printf "%s\t%s\t%s\t" 0 0 1 ;;
-x) printf "%s\t%s\t%s\t" -1 0 0 ;;
-y) printf "%s\t%s\t%s\t" 0 -1 0 ;;
-z) printf "%s\t%s\t%s\t" 0 0 -1 ;;
esac
done
for i in 2 4 6; do
printf "%s\t" "${line[$i]}"
done
echo
done < "$filename"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)