awk 最初の列が変更されると、数値が変更される新しい列が印刷されます。

awk 最初の列が変更されると、数値が変更される新しい列が印刷されます。

他のケースに基づいて自分で試してみましたが失敗しました。 awkはタブ区切りのファイルを再印刷したいが、最後に1から始まり、追加の列を増やし、列1が同じで最後の列が列1に新しい値がある場合は1にリセットされます。

簡単な例、列1〜3が入力で出力に最後の列がある場合:

A11R Q9Y5X3 SNX5  1
A12L Q9Y316 MEMO1 1
A12L Q70CQ2 USP34 2
A12L Q8N7H5 PAF1  3
A12L Q8IZL8 PELP1 4
A13L Q5SY16 NOL9  1
A13L Q6P1J9 CDC73 2
A13L Q8WVC0 LEO1  3
A13L Q9Y4W2 LAS1L 4
A13L Q6PD62 CTR9  5

まず、ファイルを読み取り、列1の値の配列を作成し、列1が前の行と同じif条件に従ってファイルを印刷する必要があることを知っています。 i++

私は試した:

awk '{A[++c] = $1} END {d=1; for ( i = 1; NR == i; i++ ) {if (A[i] = A[i-1]) {d++} else {d=1}; print d, $0}}'

しかし、明らかに動作方法の基本的な知識がありません。

答え1

$ awk -F '\t' 'BEGIN { OFS=FS } $1 != save { counter = 1; save = $1 } { print $0, counter++ }' file
A11R    Q9Y5X3  SNX5    1
A12L    Q9Y316  MEMO1   1
A12L    Q70CQ2  USP34   2
A12L    Q8N7H5  PAF1    3
A12L    Q8IZL8  PELP1   4
A13L    Q5SY16  NOL9    1
A13L    Q6P1J9  CDC73   2
A13L    Q8WVC0  LEO1    3
A13L    Q9Y4W2  LAS1L   4
A13L    Q6PD62  CTR9    5

コードawkは、最初のフィールドの値をに格納されている値と比較しますsave。値が異なる場合、カウンタはcounter1にリセットされ、記憶された値は最初のフィールドの値で更新されます。

その後、行が出力され、カウンタが最後のフィールドとして追加され、インクリメントされます。

答え2

あなたの例によれば、最初のフィールドの値と最後の実行のカウンタ変数を覚えておくだけです。

awk -F'\t' 'BEGIN{ OFS=FS }
{
  # if same field, increment counter, else reset counter
  count=(last==$1 ? ++count : 1)

  # remember first field
  last=$1
  
  print $0, count
}' file

答え3

ミラーを使用して:

$ mlr --tsv -N step -a counter -f 1 -g 1 file

-Nファイルのタイトルはありません。

step動詞は、連続したレコード(カウンタ、ewmaなど)間で何かを計算するために使用され、レコードの一部のフィールドにグループ化できます。

次のコマンドは同様の結果を提供しますが、カウンタは最初のフィールドとして追加されます。

$ mlr --tsv -N cat -n -g 1 file

関連情報