1

基本上我要做的是从 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

4 回答 4

2

对于您的示例,此 awk 单线也适用:

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

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

于 2013-11-05T12:48:08.253 回答
2

这可能对您有用(GNU sed):

sed -i -e '5,8R a.txt' -e '5,8d' b.txt
于 2013-11-05T12:36:24.167 回答
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
Then if line number of B.txtare between 5and 8replace value using info from arraya
结果存储在临时文件中tmp,然后移回B.txt

于 2013-11-05T12:11:05.477 回答
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 打印是我自己在脚本中为变量导入字符串的首选方法,因为它不会像 cat 那样导致 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

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

于 2013-11-05T13:28:32.700 回答