파일에 증분 ID 열 추가

파일에 증분 ID 열 추가

두 가지 질문:

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은 동일한 작업을 똑같이 잘 수행할 수 있습니다. 아래 스크립트에는 각 문제를 해결하는 두 가지 기능이 있습니다. 필요에 따라 주석을 달거나 주석을 제거하십시오. 스크립트는 입력 파일을 명령줄의 첫 번째 위치 인수로 사용하여 임시 파일에 씁니다. 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"

관련 정보