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