一个完整例子
首先假如有一个要处理的文件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坐标放到第二列。
- 用sed来删除注释行
#删除第1行
sed -i 1 filename
或者
#删除1到n行
n=3
sed -i '1,'$n'd' filename
使用-i选项时,直接对文件进行修改。如果不用-i选项,或者使用-e,则sed命令不会修改原始文件,而是将处理后的文本内容输出到窗口,这时也可以使用重定向
>
来将内容输出到另一个文件
- 用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
- 完整代码
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