簡體   English   中英

使用Sed / AWK / Perl從塊中提取第K條線

[英]Extract K-th Line from Chunks Using Sed/AWK/Perl

我有一些看起來像這樣的數據。 它分為四行。 每個塊均以@字符開頭。

@SRR037212.1 FC30L5TAA_102708:7:1:741:1355 length=27
AAAAAAAAAAAAAAAAAAAAAAAAAAA
+SRR037212.1 FC30L5TAA_102708:7:1:741:1355 length=27
::::::::::::::::::::::::;;8
@SRR037212.2 FC30L5TAA_102708:7:1:1045:1765 length=27
TATAACCAGAAAGTTACAAGTAAACAC
+SRR037212.2 FC30L5TAA_102708:7:1:1045:1765 length=27
88888888888888888888888888

我要做的是提取每個塊的最后一行。 屈服:

::::::::::::::::::::::::;;8
888888888888888888888888888

請注意,塊的最后一行可以包含任何標准ASCII字符,包括@

有沒有行之有效的辦法?

以下sed命令將在圖案后打印第三行:

sed -n '/^@/{n;n;n;p}' file.txt

如果沒有空行:

perl -ne 'print if $. % 4 == 0' file
$ awk 'BEGIN{RS="@";FS="\n"}{print $4 } ' file

::::::::::::::::::::::::;;8
88888888888888888888888888

如果您總是將這4行放在塊中,則可以采用其他方法

$ ruby -ne 'print if $.%4==0' file
::::::::::::::::::::::::;;8
88888888888888888888888888

$ awk 'NR%4==0' file
::::::::::::::::::::::::;;8
88888888888888888888888888

似乎您的行總是在以“ +”開頭的行之后,所以

$ awk '/^\+/{getline;print}' file
::::::::::::::::::::::::;;8
88888888888888888888888888

$ ruby -ne 'gets && print if /^\+/' file
::::::::::::::::::::::::;;8
88888888888888888888888888

這會@開頭的行之前以及最后一行的行之前打印。 它可以處理大小不一致的塊,但是假定只有塊開頭以@開頭。

sed -ne '1d;$p;/^@/!{x;d};/^@/{x;p}' file

一些解釋是為了:

  • 首先,您不需要第一行,因此將其刪除1d
  • 接下來,您總是需要最后一行,因此將其打印為$p
  • 如果沒有匹配項,則將其交換到保持緩沖區中,然后將其刪除x;d
  • 如果確實有匹配項,則將其從保留緩沖區中交換出來,並打印x;p

這類似於狗狗的答案

awk '/^@/ {mark = NR} NR == mark + 3 {print}' inputfile

並且,就像該答案一樣,無論每個塊中的行數如何(只要至少有4行),它都將起作用。

但是,該答案的直接類似物為:

awk '/^@/ {next; next; next; print}' inputfile

這可以使用grep輕松完成

grep -A 1 '^@' ./infile

這可能對您有用(GNU sed):

sed '/^@/,+2d' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM