Linux仅合并来自多个文件的行的子集

时间:2019-04-15 12:09:17

标签: 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的文件夹的名称

我现在处于以下步骤:

  • 如何对drive1子文件夹中的所有file.csv文件执行此操作
  • 如何将结果存储在一个名为“ samples.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/^/{},/'

1 个答案:

答案 0 :(得分:0)

我也不是xargs的忠实拥护者,我发现find -exec更加易于使用,请让我解释一下:
想象一下我想对文件file1.txt做些什么:

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

启动命令,并使用带有参数sw1sw2param1的开关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,' {} \;