用shell脚本删除文本文件头几行注释,并交换前两列内容

一个完整例子

首先假如有一个要处理的文件X,其中内容如下

#y x 数据
1     9     0.10
1     10    0.20
1     11    0.30
2     9     0.40
2     10    0.50
2     11    0.70
3     9     0.80
3     10    0.90
3     11    1.00

文件中第一行是注释。其余各行中,第一列是y坐标,第二列是x坐标。我们要做的是,将第一行注释删除掉,然后将x坐标放到第一列,y坐标放到第二列。

  1. 用sed来删除注释行
#删除第1行
sed -i 1 filename

或者

#删除1到n行
n=3
sed -i '1,'$n'd' filename

使用-i选项时,直接对文件进行修改。如果不用-i选项,或者使用-e,则sed命令不会修改原始文件,而是将处理后的文本内容输出到窗口,这时也可以使用重定向>来将内容输出到另一个文件

  1. 用gawk来交换第一第二列
#默认以空格或制表符作为分隔符
gawk '{printf "%15.6f %15.6f %15.6f\n",$2,$1,$3}' file1 > file2

如果分隔符是逗号或者分号等其他符号,需要用-F选项:

#以逗号为分隔符
gawk -F"," '{printf "%15.6f %15.6f %15.6f\n",$2,$1,$3}' file1 > file2
  1. 完整代码

swap12col.sh

#swap12cols: 交换文件前两列的函数
#参数1: 要交换第1第2列的文件
#参数2: 交换第1第2列后要输出到的文件
#参数3: 原始文件中,需要删除的头几行的行数
#参数4: 分隔符号
function swap12cols(){
    
    
    original_file=$1
    output_file=$2
    n=$3
    cp $original_file ${original_file}_copy #复制一份副本
    
    if (($n>0)) #如果n>0
    then
        sed -i '1,'$n'd' ${original_file}_copy #删除前n行
    fi
    #交换第一第二行
    gawk -F"$4" '{printf "%15.6f %15.6f %15.6f\n",$2,$1,$3}' ${original_file}_copy > $output_file
    
    rm ${original_file}_copy #删除副本
}

#调用函数,交换X前两列,并删除前1行,结果输出到X2,分隔符为空格
swap12cols X X2 1 " "

在命令行中输入bash swap12col.sh,得到输出文件X2,文件内容如下

       9.000000        1.000000        0.100000
      10.000000        1.000000        0.200000
      11.000000        1.000000        0.300000
       9.000000        2.000000        0.400000
      10.000000        2.000000        0.500000
      11.000000        2.000000        0.700000
       9.000000        3.000000        0.800000
      10.000000        3.000000        0.900000
      11.000000        3.000000        1.000000

猜你喜欢

转载自blog.csdn.net/X_And_Y/article/details/115076200