根据另一个文件中的id列表过滤csv文件

根据另一个文件中的id列表过滤csv文件

我有一个大的 csv 文件,其中包含以下格式文件 1:

id,ICD,CT
16214497,008.8,1
16227244,401.1,45
27154870,780.79,1

我有另一个 txt 文件,其中有一列 id 列表(标题 id)。文件2:

id
16214497
27154870

我想要另一个文件,其数据仅限于文件 2 中的 id 列表

输出文件:

id,ICD,CT
16214497,008.8,1
27154870,780.79,1

答案1

如果文件具有相同顺序的公共行,

join -t, -j1 file1.txt file2.txt

解释

请参阅man join获取更多信息。基本上,join这两个文件,跳过“不可配对的行”。分隔符是逗号-t,,并在字段 1 上连接-j1

答案2

使用csvjoin基于Python的csvkit

$ csvjoin -Ic id file\ 1 file\ 2
id,ICD,CT
16214497,008.8,1
27154870,780.79,1

-I标志禁用类型推断,以便将此类字段008.8视为字符串而不是数字(这可能会导致重新格式化)。此方法似乎可以透明地处理 DOS/Windows 样式的行结尾。


使用 awk 的替代快速连接:

awk -F, 'NR==FNR {a[$1]; next} $1 in a' file\ 2 file\ 1

如果您的文件有 DOS/Windows 行结尾(CRLF 代替普通 LF),那么您可以尝试

awk -vRS='\r\n' -F, 'NR==FNR {a[$1]; next} $1 in a' file\ 2 file\ 1

dos2unix或先使用、等转换文件trsed

答案3

grepsed

您可以将 a 添加^到 file2 的每行开头,并将 a 添加,到 file2 的每行末尾,然后使用grep

grep -f <(sed 's/^/^/;s/$/,/' file2) file1

选项-f从文件中读取模式(在我们的示例中不是从真实文件中读取模式,而是从进程替换中读取<(…))。

相关内容