使用Bash的GNU Parallel与cat时移除多文件扩展名的问题
问题解决:GNU Parallel 仅接收第一列数据的问题
问题根源
你使用的 sed 's/\..*//' 是对整行文本进行全局替换,会把每行中第一个.之后的所有内容(包括逗号和第二列的全部内容)彻底删除。比如原行 file1a.extension.extension,file1b.extension.extension 经过sed处理后,会变成 file1a——逗号和第二列数据完全丢失,导致Parallel只能读取到第一列,第二列自然为空。
解决方案
方案1:用awk分别处理列后传给Parallel
通过awk拆分CSV列,仅对第二列移除扩展名,第一列保留原格式,再将处理后的结果传给Parallel:
cat /home/filepairs.csv | awk -F',' '{print $1 "," gensub(/\..*/, "", 1, $2)}' | parallel --colsep ',' echo column 1 = {1} column 2 = {2}
方案2:用Parallel内置功能处理第二列
直接借助Parallel的内置文本替换能力,对第二列单独做扩展名移除操作,省去额外的sed步骤:
cat /home/filepairs.csv | parallel --colsep ',' echo column 1 = {1} column 2 = '{= s/\..*// =}'
验证输出
执行上述任一命令后,会得到你预期的结果:
column 1 = file1a.extension.extension column 2 = file1b column 1 = file2a.extension.extension column 2 = file2b
内容的提问来源于stack exchange,提问作者Gabriel G.
相关产品推荐
相关产品推荐

