我有一个大的 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
或先使用、等转换文件tr
。sed
答案3
与grep
和sed
:
您可以将 a 添加^
到 file2 的每行开头,并将 a 添加,
到 file2 的每行末尾,然后使用grep
:
grep -f <(sed 's/^/^/;s/$/,/' file2) file1
选项-f
从文件中读取模式(在我们的示例中不是从真实文件中读取模式,而是从进程替换中读取<(…)
)。