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指定用于行号的字符数。


编辑: 作为斯蒂芬·查泽拉斯中指出评论-w1flag将1位以上的数字截断。这可能是 Solaris 实用nl程序实现中的一个错误。另外,您可能需要对特殊行内容 ( -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 shell 或进行调整$PATH以获取标准环境,如 中详述standards(5))。

相关内容