두 가지 질문:
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"