CSV 파일에 새 열 추가

CSV 파일에 새 열 추가

bash 스크립트를 사용하여 csv 파일의 시작 부분에 두 개의 새 열을 추가하여 파일 이름의 처음 네 글자가 첫 번째 열의 값이고 다음 두 글자가 두 번째 열의 값이 되도록 하고 싶습니다. 열. 예를 들어, 내 .csv 파일 이름이 "exam_20"인 경우 "exam"에 대한 모든 항목이 포함된 새 첫 번째 열과 "20"에 대한 모든 항목이 포함된 새 두 번째 열이 필요합니다. Bash에서 이것을 달성하는 방법을 아는 사람이 있습니까? 미리 감사드립니다.

답변1

그리고 awk:

#!/usr/bin/awk -f

BEGIN { OFS="," };

FNR==1 {
  split(FILENAME,c,/[_.]/);
};

{ print c[1], c[2], $0 }

또는 명령줄에서 한 줄의 코드로 실행하거나 셸 스크립트에 포함되어 실행합니다.

awk -v OFS=',' 'FNR==1 {split(FILENAME,c,/[_.]/)}; {print c[1],c[2],$0}' *.csv

c각 입력 파일에 대해 문자 클래스를 [_.]필드 구분 기호로 사용하여 각 FILENAME을 배열로 분할합니다 . 배열의 필드 1과 2는 c파일의 각 줄 앞에 추가됩니다.

출력 예:

$ ./zsha.awk exam_20.csv 
exam,20,1,2,3,4
exam,20,5,6,7,8
exam,20,9,10,11,12

예제에 사용된 입력 데이터는 다음과 같습니다.

$ cat exam_20.csv 
1,2,3,4
5,6,7,8
9,10,11,12

답변2

이 코드는 이를 수행하기 위해 sed를 사용해야 하며, 실행 파일로 저장하고, 소스 파일의 전체 경로를 첫 번째(유일한) 인수로 사용하여 실행해야 합니다. 원하는 경우 출력을 새 파일에 저장할 수 있습니다.

#!/bin/bash
FILE=$1
# check the file exists
[[ -s $FILE ]] || { echo "Can't locate file '$FILE', aborting" >&2; exit 1; }
# get the filename without directory
NAME=$(basename "$1")
# get the first 4 characters as FIRST
FIRST=${NAME:0:4}
# get the 6th & 7th characters as SECOND
SECOND=${NAME:5:2}
# are we good to go?
read -t30 -p "About to prefix '$FIRST,$SECOND,' to all lines in $FILE - ok (y/-): "
[[ $REPLY == "y" ]] || { echo "No changes made"; exit 0; }
# do it
sed "s/^/$FIRST,$SECOND,/" "$FILE"
exit 0

파일 시험_02:

line1,some,stuff
line2,some,more,stuff

산출:

exam,02,line1,some,stuff
exam,02,line2,some,more,stuff

관련 정보