如何将多组文件合并后执行AWK脚本的操作写成单条命令?
整合重复的paste+awk操作成单条命令
当然可以!你这种重复的批量操作完全可以用shell工具或者循环来简化,下面给你几个实用的方案,挑适合你的用就行:
方案1:Bash循环+大括号展开(最直观)
这是最容易理解和实现的方式,直接针对你的X/Y/Z前缀做循环:
for prefix in X Y Z; do paste "${prefix}"{1,2,3}.txt | awk -f awkfile.awk done
如果想写成一行命令,直接压缩就行:
for prefix in X Y Z; do paste "${prefix}"{1,2,3}.txt | awk -f awkfile.awk; done
这里的${prefix}{1,2,3}.txt会自动展开成X1.txt X2.txt X3.txt、Y1.txt Y2.txt Y3.txt这类组合,和你手动敲的文件名完全一致,执行效果和三条命令一模一样。
方案2:自动匹配前缀(扩展性更强)
如果以后可能新增其他前缀的文件组(比如A1/A2/A3、B1/B2/B3),可以用通配符自动识别所有带1.txt的前缀,不用手动写前缀列表:
for file in *1.txt; do prefix="${file%1.txt}" # 从文件名里去掉"1.txt",得到前缀X/Y/Z paste "${prefix}"1.txt "${prefix}"2.txt "${prefix}"3.txt | awk -f awkfile.awk done
这个命令会自动扫描当前目录下所有*1.txt文件,提取它们的前缀,然后对应处理每组的三个文件,扩展性拉满。
方案3:并行处理(适合大文件)
如果你的文件比较大,想加快处理速度,可以用GNU Parallel(大部分Linux发行版可以通过包管理器安装,比如apt install parallel)来并行执行任务:
parallel 'paste {} {=s/1/2/=} {=s/1/3/=} | awk -f awkfile.awk' ::: *1.txt
这里的::: *1.txt提供所有*1.txt作为输入,{=s/1/2/=}是Parallel的替换语法,把当前文件名里的1替换成2,同理得到第三个文件,然后并行执行每组的paste+awk操作。
额外小技巧
如果需要把每组的输出保存到单独的文件里,只要在命令后面加个重定向就行,比如方案1里可以改成:
for prefix in X Y Z; do paste "${prefix}"{1,2,3}.txt | awk -f awkfile.awk > "${prefix}_result.txt" done
这样X组的输出会存到X_result.txt,Y组到Y_result.txt,以此类推。
内容的提问来源于stack exchange,提问作者Patrick.B
相关产品推荐
相关产品推荐

