与SED提取线路的问题



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

Cl -2.30000000 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

MN 0.0000000 0.00000000000000000000000

CL 2.30000000 0.0000000000000000000

...

等等。我需要逐行提取此数据并将其写入另一个文件。我正在使用以下代码来测试我在做什么:

ABC=$(sed -n "6 s/[A-Z]//p" $XYZ)
echo $ABC

其中xyz是文件名。但是,我获得的输出如下(例如(:

0.00000000 0.00000000 -2.20000000

也就是说,一开始的字母没有打印。有人知道为什么会发生这种情况,以及如何解决这个问题?谢谢。

好吧,我不知道您到底想实现什么。假设数据文件是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

最新更新