基本上我要做的是从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
答案 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
的行号介于5
和8
之间,则使用数组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
数据结构化。这都是关于数据结构的。正确地构建您的数据,您几乎不会有任何工作。