CSVレコードを順次変更

CSVレコードを順次変更

ファイルのテキストを順番に変更したいと思います。

ファイルの内容は次のとおりです。

1,01-JUN-2016,ABC
2,01-JUN-2016,ABC
3,01-JUN-2016,ABC
4,01-JUN-2016,ABC
5,01-JUN-2016,ABC
6,02-JUN-2016,ABC
7,02-JUN-2016,ABC
8,02-JUN-2016,ABC
9,02-JUN-2016,ABC
10,02-JUN-2016,ABC
11,02-JUN-2016,ABC
12,02-JUN-2016,ABC
13,02-JUN-2016,ABC
14,02-JUN-2016,ABC

次のように修正したいと思います。

1,01-JUN-2016,ABC1
2,01-JUN-2016,ABC2
3,01-JUN-2016,ABC3
4,01-JUN-2016,ABC4
5,01-JUN-2016,ABC5
6,02-JUN-2016,ABC6
7,02-JUN-2016,ABC7
8,02-JUN-2016,ABC1
9,02-JUN-2016,ABC2
10,02-JUN-2016,ABC3
11,02-JUN-2016,ABC4
12,02-JUN-2016,ABC5
13,02-JUN-2016,ABC6
14,02-JUN-2016,ABC7

答え1

awkを使う

awk '$0=$0 (NR-1)%7+1' file

または

awk '{print (NR-1)%7+1}' file

デフォルトでは、1を引くことは数字0から始まります。
Modulo 7 は 7 行目ごとに繰り返されます。
さらに、7 mod 7は0なので、私たちが始めたいのではないので、1から始めたいので+1します。

答え2

$ awk -F, 'FNR < 8 { print $0$1 }; FNR > 7 {print $0($1-7)}' arvind.txt 
1,01-JUN-2016,ABC1
2,01-JUN-2016,ABC2
3,01-JUN-2016,ABC3
4,01-JUN-2016,ABC4
5,01-JUN-2016,ABC5
6,02-JUN-2016,ABC6
7,02-JUN-2016,ABC7
8,02-JUN-2016,ABC1
9,02-JUN-2016,ABC2
10,02-JUN-2016,ABC3
11,02-JUN-2016,ABC4
12,02-JUN-2016,ABC5
13,02-JUN-2016,ABC6
14,02-JUN-2016,ABC7

行番号が8より小さい場合は、行全体を印刷してから最初のフィールドを印刷します。行番号が7より大きい場合は、行全体を印刷してから最初のフィールドから7を引いた値を印刷します。

ちなみに、現在の入力ファイルでこれまでに見た FNR入力レコードの数です。組み込み変数です。持っているawkFNRawk何もない(偶然を超えて)入力ファイルの最初のフィールド値に関連しています。

ただし、複数の入力ファイルを使用してこのコマンドを実行し、各ファイルの個々の行数ではなく、すべての入力ファイルの累積行数が必要な場合は、代わりにNR使用してくださいFNR

答え3

この試み:

awk -F, '$1 <=7 { print $0$1 }; $1 > 7 {print $0($1-7)}' filename

関連情報