为行错误合并文件行
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
因为它不需要将所有文件之一加载到内存中。当然,如果您有足够的内存,一次读取一个文件可能 运行 比逐行读取每个文件快。如果成功,结果应该是一样的。
我有两个长度相同的文件,我想每行合并一行。例如,这是我的文件:
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
因为它不需要将所有文件之一加载到内存中。当然,如果您有足够的内存,一次读取一个文件可能 运行 比逐行读取每个文件快。如果成功,结果应该是一样的。