在shell脚本中移动文本文件之间的行

时间:2013-11-05 12:03:23

标签: bash replace sed awk sh

基本上我要做的是从A.txt中移动第1到第4行 并用它们替换B.txt中的第5行到第8行 我想出了如何用sed获得前四行,
但我无法弄清楚如何“发送”它们来替换第二个txt文件中的行。

cat A.txt
1 a
2 b
3 c
4 d
5 e


cat B.txt
one
two
three
four
five
six
seven
eigh
nine

结果

one
two
three
four
1 a
2 b
3 c
4 d
nine

4 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed -i -e '5,8R a.txt' -e '5,8d' b.txt

答案 1 :(得分:2)

对于你的例子,这个awk单行也适用:

awk 'NR>4&&NR<9{getline $0<"a.txt"}7' b.txt

这会打印预期的输出,如果要将其保存回b.txt,则需要使用重定向。

答案 2 :(得分:1)

awk应该:

awk 'FNR==NR {a[NR]=$0;next} FNR>=5 && FNR<=8 {$0=a[FNR-4]}1' A.txt B.txt > tmp && mv tmp B.txt

它将A.txt的行存储在名为a的数组中 然后,如果B.txt的行号介于58之间,则使用数组a中的信息替换值 结果存储在临时文件tmp中,然后移回B.txt

答案 3 :(得分:0)

#!/usr/local/bin/bash -x

sed -n '1,4p' B.txt > B.txt.tmp
sed -n '1,4p' A.txt >> B.txt.tmp
sed -n '9p' B.txt >> B.txt.tmp

mv B.txt B.txt.bak
mv B.txt.tmp B.txt

这是静态的。不过,只要你知道你的行地址,这就行了。

如果您需要支持可变跨度长度,则需要在文件中执行以下操作: -

#----------numbers-begin----------
one
two
three
four
#----------numbers-end----------

从那里,您可以通过以下方式访问文件: -

sed -n '/--numbers-begin--/,/--numbers-end--/p' <filename> > newfile

这不仅可以让你使用锚点,而且sed打印是我自己首选的在脚本中为变量导入字符串的方法,因为它不会导致shell尝试将文本解释为命令,如猫出于某种原因。

您在将来的文件中可以做的另一件事是这样的: -

numbers:one
numbers:two
numbers:three
numbers:four
words:dog
words:cat
words:rat

然后: -

#!/usr/local/bin/bash

for i in $(sed -n '/^/,/$/p' file)
do
   if [ $(echo ${i} | sed -n '/numbers/p' ]
   then
   echo ${i} | cut -d':' -f2 >> numbers-only-file
   fi
done

数据结构化。这都是关于数据结构的。正确地构建您的数据,您几乎不会有任何工作。