如何基于字符编码合并多个文本文件?
合并ISO编码TXT文件到all.txt的解决方案
我来帮你搞定这个问题!你已经用file -I *.txt | grep "charset=iso"筛选出了目标文件,接下来只需要两步:提取文件名、转码合并(推荐统一转成UTF-8避免乱码)。
方法一:自动识别具体ISO编码并转UTF-8合并
这个命令会自动识别每个文件的具体ISO子编码(比如iso-8859-1、iso-8859-15等),然后统一转成UTF-8追加到all.txt:
file -I *.txt | grep "charset=iso" | awk -F ': ' '{print $1}' | xargs -I {} iconv -f $(file -I {} | awk -F 'charset=' '{print $2}') -t utf-8 {} >> all.txt
- 拆解各部分作用:
awk -F ': ' '{print $1}':从file -I的输出里提取纯文件名(去掉后面的编码描述)xargs -I {}:把每个文件名传递给后续的iconv命令iconv -f [原编码] -t utf-8 {}:将原文件转码为通用的UTF-8格式>> all.txt:把转码后的内容追加到目标文件(如果想覆盖已有内容,用>代替>>)
方法二:已知统一为某类ISO编码(比如iso-8859-1)
如果你确定所有筛选出的文件都是同一种ISO编码(比如西欧常用的iso-8859-1),可以用更简洁的命令:
file -I *.txt | grep "charset=iso-8859-1" | awk -F ': ' '{print $1}' | xargs cat | iconv -f iso-8859-1 -t utf-8 > all.txt
这里先拼接所有文件内容,再统一转码,效率会稍高一些。
可选:不转码直接合并(不推荐)
如果不需要转码,只想直接合并原编码文件,可以用:
file -I *.txt | grep "charset=iso" | awk -F ': ' '{print $1}' | xargs cat >> all.txt
但这样合并后的文件编码是混合状态,打开时可能需要手动切换编码才能正常显示,所以更推荐转成统一编码的方式。
内容的提问来源于stack exchange,提问作者nesdroc
相关产品推荐
相关产品推荐

