【问题标题】:cat lines from X to Y of multiple files into one filecat 将多个文件的 X 到 Y 行合并到一个文件中
【发布时间】:2016-06-15 08:23:39
【问题描述】:

我在 3 个不同的文件夹中有很多大文件,我想从中复制从 X 到 Y 的同名文件的行,并将它们附加到同名的新文件中。 我试过做

ls seed1/* | while read FILE; do
head -n $Y  | tail -n $X seed1/$FILE seed2/$FILE seed3/$FILE  > combined/$FILE
done

这对 $FILE 的第一个值起作用,但不会返回提示,因此我无法执行此循环。

例如,我在三个不同的文件夹seed1、seed2和seed3中有以下文件:

seed1/foo.dat
seed1/bar.dat
seed1/qax.dat

seed2/foo.dat
seed2/bar.dat
seed2/qax.dat

seed3/foo.dat
seed3/bar.dat
seed3/qax.dat

我想将所有文件的第 10 到 20 行合并到一个合并文件夹中:

combined/foo.dat
combined/bar.dat
combined/qax.dat

每个文件总共有 30 行,种子 1、种子 2 和种子 3 各有 10 行。

【问题讨论】:

  • 提示消失是因为你没有给'head'一个文件参数。使用 ls 生成 FILE 然后覆盖 FILE 看起来也很可疑。

标签: awk sed cat tail head


【解决方案1】:

不需要循环:

awk -v x=10 -v y=20 '
    FNR==1 { out = gensub(/.*\//,"combined/",1,FILENAME) }
    FNR>=x { print > out }
    FNR==y { nextfile }
' seed*/*.dat

以上假设在调用 awk 之前“组合”目录已经存在(无论是否为空),并使用 GNU awk 进行 gensub() 和 nextfile 以及内部文件管理。使用其他 awk 的解决方案效率较低,需要更多编码,并且需要您在要打开的文件过多时管理关闭文件。

【讨论】:

  • 抱歉,我的问题不清楚..你能编辑你的答案来适应这个问题吗(我已经编辑过)?
  • 编辑您的问题以澄清您要执行的操作,因为我们无法从脚本中判断出您想要执行的操作不是您真正想要的(显然,因为我们已经尝试过并且显然猜错了)。包括简洁、可测试的样本输入和预期输出。
  • 我猜for f in seed1/*; do b=${f#seed1/}; awk -v x="$x" -v y="$y" 'FNR >=x; FNR==y{nextfile}' "$f" "seed2/$b" "seed3/$b" >"combined/$b"; done
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多