데이터베이스에서 데이터를 추출하여 csv 파일에 로드하는 스크립트를 만들었습니다. SunOS hstz1454 5.10
시스템을 사용하고 있습니다 . 각 줄의 시작 부분에 쉼표를 붙이는 순서를 만들려고 합니다.
데이터는 다음과 같습니다.
1,1,1535,0,1,Y,Y
1,1,1535,10,2,Y,Y
1,1,1535,20,1,Y,Y
1,1,1535,30,2,Y,Y
1,1,1535,40,1,Y,Y
내 csv 파일에서 각 줄의 시작 부분에 쉼표가 뒤에 오는 시퀀스 번호를 생성하길 원합니다.
1,1,1,1535,0,1,Y,Y
2,1,1,1535,10,2,Y,Y
3,1,1,1535,20,1,Y,Y
4,1,1,1535,30,2,Y,Y
5,1,1,1535,40,1,Y,Y
이것은 증분 없이만 인쇄하는 코드입니다 1
. 새 줄마다 증분하려면 어떻게 해야 합니까?
for fname in conv2016_02_cos_speed2percent_data_migration.csv
do
echo "adds a seq number on each line for $fname"
sed 's/.*/1,&/' $fname > tmp.tmp
mv tmp.tmp $fname
done
답변1
사용 nl
:
nl -s, -w1 file
이렇게 하면 각 줄의 시작 부분에 숫자가 증가합니다. -s,
번호와 줄의 나머지 부분을 쉼표로 구분하도록 지정합니다. -w1
줄 번호에 사용되는 문자 수를 지정합니다.
편집하다: 처럼스티븐 차제라스에서 지적했다논평, -w1
플래그는 1자리 이상의 숫자를 자릅니다. 이는 nl
Solaris 유틸리티 구현의 버그일 수 있습니다. 또한 특수 줄 내용( -d $'\n\n'
)과 빈 줄(-ba) 에 번호를 매겨야 할 수도 있습니다 .
NL='
'
nl -s, -ba -d "$NL$NL" file
출력( 포함 GNU coreutils 8.12.197
):
$ nl -s, -ba -d "$NL$NL" file
1,4,2,64,1088,80,1,Y,Y
2,5,2,64,1088,95,2,Y,Y
3,8,2,1088,39813120,10,12,Y,Y
4,6,2,1088,39813120,0,2,Y,Y
5,7,2,1088,39813120,5,1,Y,Y
6,8,2,1088,39813120,10,2,Y,Y
스크립트에서는 다음과 같습니다.
NL='
'
for fname in conv2016_02_cos_speed2percent_data_migration.csv; do
nl -s, -ba -d "$NL$NL" "$fname" > tmp.tmp && mv tmp.tmp "$fname"
done
답변2
awk 메서드는 다음과 같습니다.
awk -v OFS=, '{print NR, $0}' < "$fname" > tmp && mv -- tmp "$fname"
그리고 sed가 있는 고양이
cat -n < "$fname" |
sed 's/^[[:blank:]]*\([[:digit:]]*\)[[:blank:]]*/\1,/' > tmp &&
mv -- tmp "$fname"
Solaris에서는 를 사용합니다 /usr/xpg4/bin/sed|awk
(또는 command -p sed|awk
POSIX 셸을 사용하거나 $PATH
에 자세히 설명된 대로 표준 환경을 얻기 위해 조정하는 경우 standards(5)
).