我有一个文件,其中数据采用以下格式:
Cl -2.30000000 0.00000000 0.00000000
Mn 0.00000000 0.00000000 0.00000000
Cl 2.30000000 0.00000000 0.00000000
...
等等更多行。我需要逐行提取这些数据并将它们写入另一个文件。我使用以下代码来测试我在做什么:
ABC=$(sed -n "6 s/[A-Z]//p" $XYZ)
echo $ABC
其中XYZ是文件名。但是,我得到的输出如下(作为示例):
0.00000000 0.00000000 -2.20000000
也就是说,开头的字母不是打印的。有没有人知道为什么会这样,以及如何解决这个问题?谢谢。
答案 0 :(得分:0)
嗯,我不知道你到底要做的是什么。 假设数据文件是data.txt,目标是appendto.txt
如果您需要读取一个文件的数据并将其附加到另一个文件。
cat data.txt >> appendto.txt
如果您需要更改数据列的顺序。
sed -n 's/^\([A-Z].*\) \([-0-9].*\.[0-9].*\) \([-0-9].*\.[0-9].*\) \([-0-9].*\.[0-9].*\)$/\2 \3 \4 \1/p' data.txt >> appendto.txt
如果您希望在脚本中使用它来进一步操作数据。
cat data.txt | while read line
do
col1=$(echo $line | cut -d ' ' -f 1)
col2=$(echo $line | cut -d ' ' -f 2)
col3=$(echo $line | cut -d ' ' -f 3)
col4=$(echo $line | cut -d ' ' -f 4)
# Manipulte data
# And append it
echo $col2 $col4 $col1 $col3 >> appendto.txt
done
确定你也可以使用sed,但是它会在这个脚本中产生一些开销。
cat data.txt | while read line
do
col1=$(echo $line | sed -n 's/^\([A-Z].*\) .*$/\1/p')
col2=$(echo $line | sed -n 's/^[A-Z].* \([-0-9].*\.[0-9].*\) .*$/\1/p')
col3=$(echo $line | sed -n 's/^[A-Z].* [-0-9].*\.[0-9].* \([-0-9].*\.[0-9].*\) .*$/\1/p')
col4=$(echo $line | sed -n 's/^[A-Z].* [-0-9].*\.[0-9].* [-0-9].*\.[0-9].* \([-0-9].*\.[0-9].*\)$/\1/p')
# Manipulte data
# And append it
echo $col2 $col4 $col1 $col3 >> appendto.txt
done