用sed提取一行的问题

时间:2017-06-26 07:19:21

标签: bash sed

我有一个文件,其中数据采用以下格式:

  

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

也就是说,开头的字母不是打印的。有没有人知道为什么会这样,以及如何解决这个问题?谢谢。

1 个答案:

答案 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