Solaris는 각 새 줄의 시작 부분에 시퀀스 생성기를 사용합니다.

Solaris는 각 새 줄의 시작 부분에 시퀀스 생성기를 사용합니다.

데이터베이스에서 데이터를 추출하여 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자리 이상의 숫자를 자릅니다. 이는 nlSolaris 유틸리티 구현의 버그일 수 있습니다. 또한 특수 줄 내용( -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|awkPOSIX 셸을 사용하거나 $PATH에 자세히 설명된 대로 표준 환경을 얻기 위해 조정하는 경우 standards(5)).

관련 정보