Command line 在命令行中编辑文本文件

Command line 在命令行中编辑文本文件,command-line,Command Line,我有一个像这样的大文本文件: @HWI-ST132_459:6:2208:20745:200766#AGTTCC/1 CCCAGGGGGTTGCTAGGTTGAAAGAGAAGAACTAAGCTTAAA + ca^WcZX[D_T]GQI^]^BBBBBBBBBBBBBBBBBBBBBBBB @HWI-ST132_459:6:2208:21328:200860#AGTTCC/1 CATTTTGGTGGGTTGTGGTTTTGGGGGGTTTGTTGTTGGGTT + ]TPKODYF[TSHWU

我有一个像这样的大文本文件:

@HWI-ST132_459:6:2208:20745:200766#AGTTCC/1
CCCAGGGGGTTGCTAGGTTGAAAGAGAAGAACTAAGCTTAAA
+
ca^WcZX[D_T]GQI^]^BBBBBBBBBBBBBBBBBBBBBBBB
@HWI-ST132_459:6:2208:21328:200860#AGTTCC/1
CATTTTGGTGGGTTGTGGTTTTGGGGGGTTTGTTGTTGGGTT
+
]TPKODYF[TSHWUQRRGZV`N_Y`c\abc]]D_BBBBBVVF
其中每4行属于同一ID。ID行以@开头。 在所有情况下,第三行为+。 我想根据第2行的前3个字符(在以
@
开头的行和以++开头的行之间)将文件拆分为不同的文件。例如,如果上面的示例是一个文件,我想按以下顺序将其划分为2个文件: 由于ID1第二行的前3个字符是
“CCC”
,因此第一个ID(以
@
开头)和相关行将是一个单独的文件,而第二个ID的第二行以
“CAT”
开头,因此第二个ID和相应行将位于另一个文件中

我确实知道如何在命令行中实现这一点(linux中的shell)。你知道吗

以下是预期产出: 文件1:

我们喜欢遗传数据:-)

我猜是unix/bash?你真的没有给它贴标签

你可以这样做

grep -hom1 '^[^@+]..' filename

-o only echos the matching chars
-m1 only prints one match
-h shouldn't be necessary - it hides the filename
先试试看它是否符合你的要求

您可以在多个文件上尝试:

for f in *.ext
do
    cp $f $f.`grep -hom1 '^[^@+]..' $f`
done
先在几个文件上试用,看看它是否符合您的要求!还要将echo放在cp之前进行试运行

如果(这可能是一个很大的如果)您的输入数据不包含任何出现的
@
字符,除了在id行的开头,您可以简单地执行以下操作:

awk '{file=substr($2,1,3); if(file) print "@"$0 > file;}' RS=@ input-file

“命令行”不是一种编程语言,它是一个泛指交互式提示的术语。你知道或准备使用什么工具?不,我不知道。塔德曼:我说的命令行是指Linux中的shell当你说“我知道怎么做”时,你的意思是你不知道怎么做吗?我的意思是我不熟悉Linux中的命令行,它不会返回我想要的。嗨,威廉,第一行以@开头。这是正确的,但我根据2行中的第1个字符(在以@开头的行之后)每4行划分一次。是的,此脚本将输入划分为以每条记录第二行的前3个字符命名的文件。它要求没有无关的
@
符号,也没有额外的空格。
awk '{file=substr($2,1,3); if(file) print "@"$0 > file;}' RS=@ input-file