我具有以下文件夹结构:
/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/^/{},/'
答案 0 :(得分:0)
我也不是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,' {} \;