linux - 通过公共(public)列标题连接 2 个文件(无需 awk/sed)

标签 linux unix join text-processing gnu-coreutils

基本上我想获取file2中的所有记录,但过滤掉标题未出现在file1中的列

示例:

文件1

Name Location

文件2

Name Phone_Number Location Email
Jim  032131       xyz      <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1e6667645e6f6f6f307d7173" rel="noreferrer noopener nofollow">[email protected]</a>
Tim  037903       zzz      <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b4cececef4c5c5c59ad7dbd9" rel="noreferrer noopener nofollow">[email protected]</a>
Pimp 039141       xxz      <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f28a8a88b2838383dc919d9f" rel="noreferrer noopener nofollow">[email protected]</a>

输出

Name Location
Jim  xyz
Tim  zzz
Pimp xxz

有没有一种方法可以在不使用 awksed 的情况下执行此操作,但仍使用 coreutils 工具?我尝试过使用 join 来完成此操作,但无法正常工作。

最佳答案

ALL_COLUMNS=$(head -n1 file2)
for COLUMN in $(head -n1 file1); do
    JOIN_FORMAT+="2.$(( $(echo ${ALL_COLUMNS%%$COLUMN*} | wc -w)+1 )),"
done
join -a2 -o ${JOIN_FORMAT%?} /dev/null file2

说明:

ALL_COLUMNS=$(head -n1 file2)

它保存所有要过滤的列名称


for COLUMN in $(head -n1 file1); do
    JOIN_FORMAT+="2.$(( $(echo ${ALL_COLUMNS%%$COLUMN*} | wc -w)+1 )),"
done

对于 file1 中的每一列,我们在file2中寻找同名的位置。并将其附加到 JOIN_FORMAT"2.<number_of_column>,"的方式


join -a2 -o ${JOIN_FORMAT%?} /dev/null file2

一旦我们有了完整的选项字符串( 2.1,2.3, ),我们就把它传递给 join 。删除最后一个 , .

join打印提供的第二个文件 ( -a2 -> file2 ) 中不可配对的行,但仅打印 -o 中指定的列选项。

关于linux - 通过公共(public)列标题连接 2 个文件(无需 awk/sed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281992/

相关文章:

mysql - 创建访问同一个表的多个联接

MySQL 根据找到的 ID 返回 1 或 0

linux - 集中安装程序

java - JRE 经常崩溃。我在 Linux 中将 RXTX 与 Java (1.6) 用于串行通信。异常(exception)

linux - 将 IP 数据包从一个 IP 地址路由到另一个 IP 地址

c++ - 如何从 std::ofstream 获取文件 ID

c++ - 不支持 VARIADIC 的宏自动注入(inject)参数

linux - 打印unix/linux中文件最多的目录

mysql - 如何在 SQL 的数学运算符中使用别名?

linux - 什么是文件系统UUID?