最初のgrepの結果、次の行の文字数を計算しますが、計算から新しい行を削除します。

最初のgrepの結果、次の行の文字数を計算しますが、計算から新しい行を削除します。

質問:

次のようないくつかのテキストファイル(.fas)があります。

ファイル1.fas:

>species1
AICGICVIAGIAIYIAAICG
>species2
AICGIVVYICAGAYICAGCG

ファイル2.fas:

>species1
AIG
>species2
GCI

私が興味を持っているのは、2行目の文字数を数えることです(ファイルが並べ替えられたときにファイルのすべての種類について同じです)。

私の現在の1つのライナー:

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

これはある程度機能しますが、計算された数字は改行文字を計算するため、実際の文字数よりも1桁高くなります。改行以外の文字のみを計算するにはどうすればよいですか?

現在の出力:

file1.fas,21
file2.fas,4

希望の出力:

file1.fas,20
file2.fas,3

ベストアンサー1

  • | wc -l行数を印刷します。
  • | wc -c改行を含む文字数を印刷します。
  • | wc -lc両方とも印刷します(行番号の最初)。

したがって、単に減算することができます。 (代わりに作成してください|wc -c

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

1行だけシーケンスを印刷する場合は、改行の代わりに1を引くことができます。

あるいは、awk行全体を一致させ、対応する文字数を計算して使用することもできます。

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

RLENGTH試合の長さです(ここではフルライン)。ここでは大文字のみを使用すると仮定します。そうでなければ.代わりに。[A-Z]

vim(テキストエディタなのでスクリプトと互換性がない可能性があります)で範囲(1行以上)を視覚的に選択し、次の操作を実行します。

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

以下を使用して改行文字を削除することもできますtr(複数行でも機能します)。

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

ところで、これを行うには他にも多くの方法があります。

おすすめ記事