ファイルに増分ID列を追加する

ファイルに増分ID列を追加する

2つの質問:

1)データを含む既存のファイルに対して新しい列(IDなど)を作成し、自動インクリメント数で新しい列IDを入力する方法はありますか?

例:(
現在のファイルにはヘッダーがあり、PIPEで区切られています。)

データは次のとおりです

"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

そうしたらいいな

"ID"|"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

2)既存の列をデータを含む既存のファイルの新しい列に置き換える方法はありますか?新しい列は「ID」で、自動インクリメント数字で埋められますか?

例:(
現在のファイルにはヘッダーがあり、PIPEで区切られています。)

データは次のとおりです

"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

そうしたらいいな

"COL1"|"COL2"|"ID"|"COL4"|"COL5"
"A1"|"B1"|"1"|"D1"|"E1"
"A2"|"B2"|"2"|"D2"|"E2"
"A3"|"B3"|"3"|"D3"|"E3"

答え1

$ cat file
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

1)

$ awk '{printf "\"%s\"|%s\n", NR==1 ? "ID" : NR-1, $0}' file
"ID"|"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

2)1)の出力を並べ替える

$ awk '{printf "\"%s\"|%s\n", NR==1 ? "ID" : NR-1, $0}' file |\
    awk 'BEGIN{FS=OFS="|"} {print $2,$3,$1,$4,$5,$6}'
"COL1"|"COL2"|ID|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"C1"|"D1"|"E1"
"A2"|"B2"|"2"|"C2"|"D2"|"E2"
"A3"|"B3"|"3"|"C3"|"D3"|"E3"

2)または直接

$ awk 'BEGIN{FS=OFS="|"} {print $1,$2,NR==1 ? "ID" : "\""NR-1"\"",$3,$4,$5}' file
"COL1"|"COL2"|ID|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"C1"|"D1"|"E1"
"A2"|"B2"|"2"|"C2"|"D2"|"E2"
"A3"|"B3"|"3"|"C3"|"D3"|"E3"

答え2

私は質問にawkとsedでタグ付けしましたが、Pythonは同じことを同じようにうまく実行できます。以下のスクリプトには、各問題を解決する2つの機能があります。必要に応じてコメントを付けるか、コメントを削除します。スクリプトは、入力ファイルをコマンドラインの最初の位置引数として使用して一時ファイルに書き込みます。main元のファイルを実際に編集するには、関数の最後の行のコメントを外します。

スクリプトソース

#!/usr/bin/env python
import sys
import os

def prepend_column(input,output):
    for index,line in enumerate(input):
        if index == 0:
            output.write(line)
            continue
        output.write('"' + str(index) +'"|' + line)

def alter_column(input,output):
    for index,line in enumerate(input):
        if index == 0: 
            output.write(line)
            continue
        vals = line.split('|')
        vals[2] = '"' + str(index) + '"'
        output.write('|'.join(vals))

def main():
    temp = '/tmp/temp_text'
    with open(sys.argv[1]) as f:
         with open(temp,'w') as t:
            # alter_column(f,t)
            prepend_column(f,t)
    # uncomment line below to actually replace original file
    # os.rename(temp,sys.argv)

if __name__ == '__main__': main()

デモ。

追加の列:

bash-4.3$ python process_columns.py data.txt 
bash-4.3$ cat /tmp/temp_text
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

列の変更:

bash-4.3$ python process_columns.py data.txt 
bash-4.3$ cat /tmp/temp_text
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"D1"|"E1"
"A2"|"B2"|"2"|"D2"|"E2"
"A3"|"B3"|"3"|"D3"|"E3"

関連情報