直接公布答案
for file in $(find ./data-do -name "*.txt")
do
oneline=$(awk 'NR==1{print $0}' ${file})
if [ -n "$oneline" ]
then
sed -i '1d' ${file}
num=$(awk 'END{print NR}' ${file} )
num=`expr $num / 2`
for(( i=1;i<$num;i++ ))
do
s=`expr $i + 1 `
j=`expr $s \* 2 `
d=`expr $j - 3 `
sed -i "$d{h;d};$j{G}" ${file}
sed -i "$d{h;d};$j{G}" ${file}
done
fi
done
echo `rename 's/\.txt/\.doc/' data-do/* data-do/testdir/*
**
以下是代码分析过程
**
循环用find语句查找在当前目录下的data-do目录下以.txt结尾的文件名
for file in $(find ./data-do -name "*.txt")
设置变量oneline是文件内容为第一行的内容
oneline=$(awk 'NR==1{print $0}' ${file})
变量oneline是否为空值
if [ -n "$oneline" ]
删除文件里内容, ‘1d’为第一行。-i参数是直接操作文件里内容,不加则只是显示结果少第一行。
sed -i '1d' ${file}
将打印出来的文件内容行号最后一个作为变量num
num=$(awk 'END{print NR}' ${file} )
num除以2
num=`expr $num / 2`
循环文件每行内容,对每两行进行替换。
for(( i=1;i<$num;i++ ))
do
s=`expr $i + 1 `
j=`expr $s \* 2 `
d=`expr $j - 3 `
sed -i "$d{h;d};$j{G}" ${file}
sed -i "$d{h;d};$j{G}" ${file}
done
将第d行内容插入到第j行,d行内容为j行,j行内容变为j+1,所以行数都发生相应变化。
sed -i "$d{h;d};$j{G}" ${file}
例如第3行插入到第1行,再第4行插入到第2行
1 3 3
2 1 4
3 2 1
4 4 2
5 5 5
6 6 6