【问题标题】:bash paste: loop through pairs of files based on wildcard, generate separate output filesbash paste:基于通配符循环遍历文件对,生成单独的输出文件
【发布时间】:2015-07-19 10:09:41
【问题描述】:

我试图让 paste 命令循环遍历文件对,将它们粘贴在一起并将每个文件作为唯一文件输出。 我已经尝试了很多东西,这里有一些:

 for i in *_temp4.csv; do paste *_temp4.csv *_temp44.csv > ${i}_out.csv; done
 #Each output contains each input file (rather than pairs). Obviously this is because of the * wildcard

 for i in *_temp2.csv_temp4.csv; do paste $_temp2_temp4.csv $_temp3_temp44.csv > ${i}_out.csv; done

没有错误,清空输出文件

 for i in *_temp2.csv_temp4.csv; do paste ${_temp2_temp4.csv} ${_temp3_temp44.csv} > ${i}_out.csv; done

输出:

 combo15.awk: line 12: ${_temp2_temp4.csv}: bad substitution

我想我一定遗漏了关于如何使用 $ 的一些非常基本的内容,但我一直在谷歌搜索一整夜都无济于事。

我的整个代码,为了上下文,虽然我不明白为什么前面的行会对此产生任何影响。

 for i in *.dat; do awk 'NR > 23 { print }' ${i} > ${i}_temp1.csv; done

 for i in *_temp1.csv; do awk 'BEGIN{OFS=FS=","}$2==0{$2="between"}BEGIN{OFS=FS=","}$2==1{$2="lego"}BEGIN{OFS=FS=","}$2==2{$2="pin"}BEGIN{OFS=FS=","}$2==3{$2="dice"}BEGIN{OFS=FS=","}$2==4{$2="jack"}BEGIN{OFS=FS=","}$2==8{$2="escape"}{print}'  ${i} > ${i}_temp2.csv; done

 for i in *_temp2.csv; do awk -v OFS="," '{$4 = $1 - prev1; prev1 = $1; print;}' ${i} > ${i}_temp3.csv; done  

 for i in *_temp2.csv; do awk -F "," 'BEGIN{print "new line"}{print $2}' ${i} > ${i}_temp4.csv; done

 for i in *_temp3.csv; do awk -F "," '{print $5}' ${i} > ${i}_temp44.csv; done

 for i in *_temp2.csv_temp4.csv; do paste $_temp2_temp4.csv    $_temp3_temp44.csv > ${i}_out.csv; done

【问题讨论】:

  • 对于输入文件? trial_02_mid.dat trial_02_bottom.dat trial_03_top.dat 所有其他输出都按预期生成,只有最后一行给我带来了麻烦。
  • 是的,以及我的 OP 中的变体。
  • 我不确定,我了解您的要求。但这是你需要的吗? for i in *_temp4.csv; do paste "$i" "${i/_temp4.csv/_temp44.csv}" > ${i}_out.csv; done
  • 几乎! for i in *_temp4.csv; do paste "$i" "${i/_temp4.csv}" "${i/_temp44.csv}" > ${i}_out.csv; done 几乎可以工作,但它有额外的列(每个额外的列都来自 *_temp4.csv 文件。问题是 .dat 因为这些是原始输入文件,我试图粘贴在一起的临时文件被命名为 .csv 我我正在尝试使用该变量(我认为它来自行首的通配符)并将其附加 _temp2.csv_tem4.csvtemp3.csv_temp44.csv 以便它采用从前几行创建的唯一文件名。

标签: bash loops wildcard paste variable-expansion


【解决方案1】:

您的问题是,您的文件名称无法控制地增长。此更改应该可以解决此问题:

for i in *.dat; do awk 'NR > 23 { print }' ${i} > ${i}_temp1.csv; done

for i in *.dat; do awk 'BEGIN{OFS=FS=","}$2==0{$2="between"}BEGIN{OFS=FS=","}$2==1{$2="lego"}BEGIN{OFS=FS=","}$2==2{$2="pin"}BEGIN{OFS=FS=","}$2==3{$2="dice"}BEGIN{OFS=FS=","}$2==4{$2="jack"}BEGIN{OFS=FS=","}$2==8{$2="escape"}{print}'  ${i}_temp1.csv > ${i}_temp2.csv; done

for i in *.dat; do awk -v OFS="," '{$4 = $1 - prev1; prev1 = $1; print;}' ${i}_temp2.csv > ${i}_temp3.csv; done

for i in *.dat; do awk -F "," 'BEGIN{print "new line"}{print $2}' ${i}_temp2.csv > ${i}_temp4.csv; done

for i in *.dat; do awk -F "," '{print $5}' ${i}_temp3.csv > ${i}_temp44.csv; done

for i in *.dat; do paste ${i}_temp4.csv    ${i}_temp44.csv > ${i}_out.csv; done

【讨论】:

  • 是的!这完美!稍后我会担心疯狂的文件名,但这解决了它。谢谢!
猜你喜欢
  • 2019-04-09
  • 2021-12-06
  • 2014-11-19
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2020-01-16
相关资源
最近更新 更多