linux - 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/^/{},/'
解决方案
我也不是 的忠实粉丝xargs
,我发现find -exec
使用起来更加清晰,让我解释一下:
想象一下我想对文件做一些事情file1.txt
:
Command -sw1 param1 -sw2 param2.1 param2.2 file1.txt
启动命令,并使用sw1
带有sw2
参数param1
的开关param2.1
和param2.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,' {} \;