如何同时从多个文本中获取某些行?

如何同时从多个文本中获取某些行?

假设我在同一目录下有100个文本,即text1.txt,text2.txt,...,text100.txt。我想从每个文本中提取某些行(例如前100行),并将这些行分别保存到另外新的100行文本中,即每个新文本有 100 行

我知道head -100 text1.txt > text1_new.txthead -100 text2.txt > text2_new.txt...可以做到。但是有没有更有效的方法可以在终端中同时提取它们呢?

谢谢!!

答案1

一种方法是

find . -name "text*.txt" -type f -print0 | xargs -0 -I{} sh -c 'f="{}"; head -100 "$f" > "${f%.txt}_new.txt"'
  • find . -name "text*.txt" -type f查找目录中的所有文本文件
  • -print0使用空字符打印文件路径以保留空格
  • xargs -0接受以 null 结尾的参数
  • -I{}用作参数的占位符
  • sh -c使用命令字符串执行 dash
  • f="{}"将参数保存在变量中f
  • head -100 "$f"头命令
  • "${f%.txt}_new.txt"将参数中的“.txt”替换为“_new.txt”

答案2

您可以遍历文件

for f in *.txt
do
    head -n100 "$f" > "${f%.txt}_new.txt"
done

需要注意的是,*.txt会在到达时展开,以列出所有匹配的文件。如果您已经运行此脚本(部分或完全),它也会匹配一些结果文件。解决方案是在运行之前删除它们 ( rm *_new.txt),或者收紧模式。

答案3

如果你想要“并行”,请使用parallel

shopt -s extglob
parallel sh -c 'out="${1%.txt}_new.txt"; head -n 100 "$1" > "$out"' _ -- !(*_new).txt

我假设你的 shell 是 bash,并且使用扩展模式循环遍历文本文件不是*_new.txt 的

相关内容