Solaris 在每个新行的开头使用序列生成器

yes*_*co1 2 sed shell-script text-processing

我创建了一个从数据库中提取数据并将其加载到 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
Run Code Online (Sandbox Code Playgroud)

我希望我的 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
Run Code Online (Sandbox Code Playgroud)

这是我的代码只打印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
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 10

使用nl

nl -s, -w1 file
Run Code Online (Sandbox Code Playgroud)

这将在每行的开头添加一个递增的数字。-s,指定数字和行的其余部分应该用逗号分隔。-w1指定要用于行号的字符数。


编辑:正如Stéphane Chazelas评论中指出的那样,该-w1标志会削减超过 1 位数的数字。这可能是 Solarisnl实用程序实现中的一个错误。此外,您可能想要对特殊行内容 ( -d $'\n\n') 和空行 (-ba) 进行编号:

NL='
'
nl -s, -ba -d "$NL$NL" file
Run Code Online (Sandbox Code Playgroud)

输出(带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
Run Code Online (Sandbox Code Playgroud)

在您的脚本中,它看起来像:

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
Run Code Online (Sandbox Code Playgroud)

  • @AndrewHenle,[在 Austin 群组邮件列表中提出的问题](http://thread.gmane.org/gmane.comp.standards.posix.austin.general/11789) (2认同)

gle*_*man 8

这是 awk 的一种方法:

awk -v OFS=, '{print NR, $0}' < "$fname" > tmp && mv -- tmp "$fname"
Run Code Online (Sandbox Code Playgroud)

和猫与 sed

cat -n < "$fname" |
sed 's/^[[:blank:]]*\([[:digit:]]*\)[[:blank:]]*/\1,/' > tmp &&
mv -- tmp "$fname"
Run Code Online (Sandbox Code Playgroud)

在 Solaris 上,使用/usr/xpg4/bin/sed|awk(或者command -p sed|awk如果使用 POSIX shell 或适应$PATH以获得标准环境,如 中所述standards(5))。