首页 > 解决方案 > linux仅合并来自多个文件的行子集

问题描述

我有以下文件夹结构:

/drive1/180204_somerandomtext/file.csv
/drive1/180504_somerandomtext/file.csv
/drive1/190101_somerandomtext/file.csv
/drive1/190305_somerandomtext/file.csv
...

每个 file.txt 具有相同的结构,但包含不同的数据。从 file.txt 我想使用以下命令仅提取行的子集:

grep -A5000 -m1 -e 'Sample_ID,' /drive1/180204_somerandomtext/file.csv | tail -n+2

此命令有效,并在以“Sample_ID”开头的行之后打印接下来的 5000 行,

我已经扩展了这个命令

grep -A5000 -m1 -e 'Sample_ID,' /drive1/180204_somerandomtext/file.csv | tail -n+2 | sed 's/^/180204_somerandomtext,/' 

使用“sed”,我现在将模式“180204_somerandomtext”添加到每行的开头,这实际上是包含 file.csv 的文件夹的名称

我现在停留在以下步骤:

我用 xargs 尝试了一些东西。它适用于 grep 命令,但管道 sed 则不起作用。

find /drive1/ -maxdepth 1 -name '1*' | cut -d '/' -f2 | xargs -I {} grep -A5000 -m1 -e 'Sample_ID,' /drive1/{}/file.csv | sed 's/^/{},/'

标签: linux

解决方案


我也不是 的忠实粉丝xargs,我发现find -exec使用起来更加清晰,让我解释一下:
想象一下我想对文件做一些事情file1.txt

Command -sw1  param1 -sw2 param2.1 param2.2 file1.txt

启动命令,并使用sw1带有sw2参数param1的开关param2.1param2.2

当我想对file1.txt目录结构中的所有内容执行此操作时,我执行以下操作:

find . -name "file1.txt" -exec Command -sw1  param1 -sw2 param2.1 param2.2 {} \;

所以我只是输入了find命令(带有一些关于在哪里找到什么的信息),然后是-exec. 之后,-exec我输入了确切的命令,将原始文件名替换为 ,{}并以\;.

在你的情况下,它会是这样的:

find /drive1 -name file.csv -exec grep -A5000 -m1 -e 'Sample_ID,' {} \;

推荐阅读