执行join关联排序三个文件的CLI命令触发用法报错,求排查
命令存在的问题及修正
1. 直接触发用法提示的语法错误:-o选项字段格式错误
从返回的用法提示能判断你使用的是BSD版本的join命令,该版本要求-o选项指定多个输出字段时,必须用逗号分隔字段,而非空格。你命令里两处-o都用空格分隔字段,会被Shell解析为多个独立参数,导致join判定参数格式非法,输出用法提示。
错误写法示例:
join -t, -1 2 -o 1.2 2.2 nobel_laureates.txt nobel_nationalities.txt # 后续的join命令同样存在该问题 join -t, -e "<<NULL>>" -1 2 -o 1.1 2.2 - capitals.txt
修正后的-o写法:
将空格替换为逗号:
-o 1.2,2.2 # 和 -o 1.1,2.2
2. 语法修复后需处理的潜在问题
- 连接字段不匹配:
管道输出的内容格式是获奖者姓名,国籍,第一个输入(标准输入,对应-1)的连接字段是第2个(国籍);而capitals.txt的行格式是国家,首都,第二个文件的连接字段应为第1个(国家),需补充-2 1参数,否则join会默认用第1个字段连接,导致无法匹配。 - 数据行格式不一致:
nobel_nationalities.txt最后一行Baroness Bertha Sophie Felicita Von Suttner无逗号和国籍,默认会被第一个join丢弃,若需保留需添加-a 1参数(保留第一个文件未匹配的行)。capitals.txt中Switzerland行无逗号和首都,建议手动补全为Switzerland,,否则join会将整行视为单个字段,无法结合-e "<<NULL>>"参数补全空值。
修正后的完整命令
join -t, -1 2 -o 1.2,2.2 nobel_laureates.txt nobel_nationalities.txt | sort -k2 -t, | join -t, -e "<<NULL>>" -1 2 -2 1 -o 1.1,2.2 - capitals.txt
内容的提问来源于stack exchange,提问作者Folkert Meeuw
相关产品推荐
相关产品推荐

