我创建了一个脚本,用于从数据库中提取数据并将其加载到 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
flag将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)
)。