为行错误合并文件行

Merging file line for line error

我有两个长度相同的文件,我想每行合并一行。例如,这是我的文件:

FileA.txt

DM  CM127861    chr14   103390285   +   NM_030943   AMN Megaloblasticanaemia1   
DM  CM118934    chr14   103395855   +   NM_030943   AMN Megaloblasticanaemia1   
DM  CM127864    chr14   103395992   +   NM_030943   AMN Megaloblasticanaemia1   
DM  CM088131    chr14   103395814   +   NM_030943   AMN Megaloblasticanaemia1   
DM  CM124403    chr14   103395776   +   NM_030943   AMN Imerslund-Gr‰sbecksyndrome
DM  CM002932    chr1    115220593   -   NM_000036   AMPD1   Adenosinemonophosphatedeaminasedeficiency
    etc

FileB.txt

TGT    C    TAT    Y
ATG    M    AAG    K
CAG    Q    GAG    E
CCG    P    TCG    S
CCG    P    CTG    L
GCG    A    GTG    V

我希望我的最终输出是:

DM  CM127861    chr14   103390285   +   NM_030943   AMN Megaloblasticanaemia1    TGT    C   TAT    Y
etc

为此,我一直在使用此粘贴命令:paste -d '\t' FileA.txt FileB.txt > combined.txt 但是,我一直收到此错误 Error reading FileA.txt。我很确定这与我的 % 符号有关。我试图将我文件中的所有 % 更改为另一个字符,但随后它 运行 变成了另一个它无法处理的字符。我很确定它会在我的整个文件中保留 运行 这些错误,因为它有一些不寻常的字符。当存在一些不寻常的字符时,是否有任何其他方法可以逐行合并文件?

ls -l 用于以下两个文件:

-rw-r--r--@ 1 christy staff 4811597 Aug 27 14:18 Translated.txt

-rw-r--r-- 1 christy staff 846004 Aug 27 14:18 Translated2.txt

有些事你没有告诉我们。例如,这没有问题:

$ paste FileA.txt FileB.txt
Syndrome    ATG Y
Syndrome%    AGT        K

如果您得到 "Error reading FileA.txt",则更表明该文件可能不存在或您没有读取权限。什么

ls -l *.txt

说?您是否偶然不知道 Unix 在文件名中区分大小写?

EDIT:可能与扩展属性有关。您可以使用

列出它们
$ xattr -l FileA.txt

$ ls -l@ *.txt

由于您文件中的 "funny" 字符,根据医生的名字判断,应该是 Imerslund-Gräsbeck 中的变音符号,它可能与编码相关。如果 ls -l@ 显示类似 com.apple.TextEncoding 的内容,请尝试使用

删除该属性
$ xattr -d com.apple.TextEncoding FileA.txt

如果出现其他属性,例如 com.apple.quarantine,也将其删除。

我无法根据您在问题中包含的数据复制您遇到的问题,所以...这是 paste 的基于 awk 的替代方法。

awk '{getline B < "fileB.txt"; print [=10=] "\t" B;}' fileA.txt > combined.txt

这会逐步执行 fileA.txt,对于每一行,它都会读取 fileB.txt 的下一行,并将这两行打印在一起。

这比基于数组的合并有优势,例如:

awk 'NR==FNR{a[NR]=[=11=];next;} {print [=11=] "\t" a[FNR];}' fileB.txt fileA.txt

因为它不需要将所有文件之一加载到内存中。当然,如果您有足够的内存,一次读取一个文件可能 运行 比逐行读取每个文件快。如果成功,结果应该是一样的。