将一个文件中的文本追加到另一个文件中的文本

3
我有两个不同的文本文件,一个包含四个字母的单词,另一个包含四位数字,每行一个。其中一个文件中的单词与另一个文件中同一行上的数字对应。例如:
CATS RATS HATS
与以下内容相匹配:
2287 7287 4287
我想将数字附加到其匹配的单词末尾,使其看起来像这样:
CATS2287 RATS7287 HATS4287
到目前为止,我已经有了以下代码:
for i in $(cat numbers); do  
  sed 's/$/'$i'/' words;
done

但问题是a)它不会将内容打印/回显到一个新文件中,b)每当第一次循环遇到一个新数字时,它都会循环遍历每个单词,因此最终,所有的单词都会与数字文件中的最后一个数字配对。 在此先感谢您的帮助。
5个回答

2
paste -d "" /path/to/letters /path/to/numbers

概念验证

$ paste -d "" CATS NUMS
CATS2287
RATS7287
HATS4287

@Tyler:在“-d”和双引号“”之间有一个空格。 - SiegeX
谢谢,伙计。粘贴正是我一直在找的东西。真不敢相信我花了这么多时间纠结于sed和awk。在我看来,bash是一门糟糕而令人困惑的语言。:\ - Tyler Shambora
1
@Tyler:一开始肯定会有点难,毕竟它有其独特之处。但是坚持下去,因为我认为了解Shell编程非常宝贵。此外,不要忘记接受最好解决你问题的答案。这有助于提高你的声誉,并帮助其他有类似问题的人知道在哪里寻找解决方案。顺便说一句,欢迎来到SO。 - SiegeX

2
你可以使用非常好用的小工具paste(1)
$ cat a
CATS
RATS
HATS
$ cat b
2287
7287
4287
$ paste -d "" a b
CATS2287
RATS7287
HATS4287
$ 

-d指定分隔符列表;我将其设为空列表:没有分隔符,没有分隔符。


1

嗯,我的带有-d""的paste版本只会得到数字,单词被覆盖了(在cygwin上的GNU paste 8.10)。我的输入文件没有回车符。

paste words numbers | tr -d '\t'

此外,仅使用shell内置命令

exec 3<words
exec 4<numbers
while read -u3 word; do
  read -u4 num
  echo $word$num
done
exec 3<&-
exec 4<&-

它是-d ""加一个空格,而不是-d"" - SiegeX
@SiegeX,嗯,有趣。不知道那是不是个bug。 - glenn jackman
哦,我现在明白了。使用 paste -d"" words numbers(""之前没有空格)时,paste 将单词 "words" 视为分隔符列表。因此它只会粘贴一个文件 "numbers"。 - glenn jackman

1

在 Mac OS X 上:

paste -d "\0" <(echo abc) <(echo def)

0

有几种方法可以做到这一点

粘贴:

paste -d "" file1 file2

awk

awk '{ getline f<"file2" ; print $0f}' file1

Bash:

exec 6<"file2"
while read -r line
do
    read -r S <&6
    printf "${line}${S}\n"
done <"file1"
exec >&6-

Ruby(1.9+)

ruby -ne 'BEGIN{f=File.open("file1")};print $_.chomp+f.readline;END{f.close}' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接