基本上我想获取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
有没有一种方法可以在不使用 awk
或 sed
的情况下执行此操作,但仍使用 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/