Text-Processing

在第一個 grep 結果後計算行中的字元,但從計數中刪除新行

  • August 26, 2020

問題:

我有多個文本文件 (.fas),如下所示:

文件 1.fas:

>species1
AICGICVIAGIAIYIAAICG
>species2
AICGIVVYICAGAYICAGCG

文件 2.fas:

>species1
AIG
>species2
GCI

我有興趣計算第二行中的字元數(一個文件中的所有物種都相同,因為它們是對齊的。

我目前的一個班輪:

for i in *.fas; do echo -n "$i," && grep -m 1 -A 1 '>' $i | tail -n 1 | wc -c; done;

這在一定程度上有效,但計算的數字比實際字元數高一個,因為它正在計算換行符。我該如何解決這個問題,所以它只計算不包括換行符的字元數?

電流輸出:

file1.fas,21
file2.fas,4

期望的輸出:

file1.fas,20
file2.fas,3
  • | wc -l列印行數。
  • | wc -c列印字元數,包括換行符。
  • | wc -lc列印兩者(首先是行數)。

所以你可以簡單地減去它們:(寫它而不是|wc -c

| wc -lc | awk '{print $2 - $1}'

如果您只在一行上列印您的序列,您可以減去 1 而不是換行符的數量。

或者你可以awk只使用,匹配整行併計算它的字元:

| awk '{match("[A-Z]*");print RLENGTH}'

RLENGTH是匹配的長度(這裡是整行)。在這裡,我假設您只使用大寫字母,否則,使用.而不是[A-Z].

vim(文本編輯器,因此它可能與您的腳本不兼容)上,直覺地選擇您的區域(一行或多行)並執行:

:'<,'>s/[A-Z]*//gn

tr您還可以使用(也適用於多行)刪除換行符:

| tr -d '\n' | wc -c

順便說一句,可能還有很多其他方法可以做到這一點。

引用自:https://unix.stackexchange.com/questions/606403