在每行的开头添加数字,每第 n 行增加 1
add numbers to beginning of each line increasing by 1 every nth line
从数字1开始,如何把这个数字加在直接后面的x行前面,后面跟着数字2也是后面的x行,以此类推,结束必须是y行,如何这样做吗?
1 jeriro ieieie ieiue
1 ieirrp wzwezeg
1 ieueujueu ueuuwiuyh
2 iejejrökx lek
2 kejejhejhe pmys
2 krejrjhrjh hegehe
3 ririrjfjf
3 iririr iezete
3 pgogto
希望对您有所帮助!!!
-bash-4.1$ awk -v a=3 -v b=1 'c<a{print b [=10=]; c+=1} c==a{c=0;b+=1}' file
1asdasdasd
1asdas
1asd
2asd
2asd
2asd
3as
3asd
-bash-4.1$ awk -v a=4 -v b=1 'c<a{print b [=10=]; c+=1} c==a{c=0;b+=1}' file
1asdasdasd
1asdas
1asd
1asd
2asd
2asd
2as
2asd
编辑 在测试了两个不同的代码(这个和@Ed Morton 的回答)之后,我观察到它们之间的性能差异很大:
$ cat lanza.sh
date
awk -v x=3 '{print (NR%x?c+1:++c), [=11=]}' file.dat > file.dat1
date
awk -v a=3 -v b=1 'c<a{print b" "[=11=]; c+=1} c==a{c=0;b+=1}' file.dat > file.dat2
date
./lanza.sh
EXEC1
jueves, 7 de mayo de 2015, 22:01:17 CEST
jueves, 7 de mayo de 2015, 22:02:41 CEST
jueves, 7 de mayo de 2015, 22:04:09 CEST
EXEC2 (REVERSE ORDER FOR AWKS IN lanza.sh)
jueves, 7 de mayo de 2015, 22:07:56 CEST
jueves, 7 de mayo de 2015, 22:09:24 CEST
jueves, 7 de mayo de 2015, 22:11:01 CEST
EXEC3 (REVERSE ORDER FOR AWKS IN lanza.sh)
jueves, 7 de mayo de 2015, 22:12:14 CEST
jueves, 7 de mayo de 2015, 22:13:57 CEST
jueves, 7 de mayo de 2015, 22:15:20 CEST
$ wc -l file.dat
30522352 file.dat
$ wc -l file.dat1
30522352 file.dat1
$ wc -l file.dat2
30522352 file.dat2
可以看出,使用模块 (%) 运算符(使用@Ed Morton 的代码),两个代码的性能差异约为 5%-10%。可能需要更多检查,但第一次尝试时差异非常显着!
equal or minus comparator times -> 1m28s, 1m37s, 1m43s
module (%) comparator times -> 1m24s, 1m28s, 1m33s
$ awk -v x=3 '{print (NR%x?c+1:++c), [=10=]}' file
1 jeriro ieieie ieiue
1 ieirirp wzwezeg
1 ieueujueu ueuuwiuyh
2 iejejrökx lek
2 kejejhejhe pmys
2 krejrjhrjh hegehe
3 ririrjfjf
3 iririr iezete
3 pgogto
$ awk -v x=4 '{print (NR%x?c+1:++c), [=10=]}' file
1 jeriro ieieie ieiue
1 ieirirp wzwezeg
1 ieueujueu ueuuwiuyh
1 iejejrökx lek
2 kejejhejhe pmys
2 krejrjhrjh hegehe
2 ririrjfjf
2 iririr iezete
3 pgogto
perl -ne 'print 1+int(($.-1)/4) ," $_"'
或
perl -ne 'printf "%d %s", (3+$.)/4 ,$_'
awk -v Cycle=3 '{print int((NR+Cycle-1)/Cycle), [=10=]}' YourFile
# or
awk -v Cycle=3 '{printf '%d %s\n' (NR+Cycle-1)/Cycle, [=10=]}' YourFile
#simplified for 3
awk '{print int((NR+2)/3), [=10=]}' YourFile
从数字1开始,如何把这个数字加在直接后面的x行前面,后面跟着数字2也是后面的x行,以此类推,结束必须是y行,如何这样做吗?
1 jeriro ieieie ieiue
1 ieirrp wzwezeg
1 ieueujueu ueuuwiuyh
2 iejejrökx lek
2 kejejhejhe pmys
2 krejrjhrjh hegehe
3 ririrjfjf
3 iririr iezete
3 pgogto
希望对您有所帮助!!!
-bash-4.1$ awk -v a=3 -v b=1 'c<a{print b [=10=]; c+=1} c==a{c=0;b+=1}' file
1asdasdasd
1asdas
1asd
2asd
2asd
2asd
3as
3asd
-bash-4.1$ awk -v a=4 -v b=1 'c<a{print b [=10=]; c+=1} c==a{c=0;b+=1}' file
1asdasdasd
1asdas
1asd
1asd
2asd
2asd
2as
2asd
编辑 在测试了两个不同的代码(这个和@Ed Morton 的回答)之后,我观察到它们之间的性能差异很大:
$ cat lanza.sh
date
awk -v x=3 '{print (NR%x?c+1:++c), [=11=]}' file.dat > file.dat1
date
awk -v a=3 -v b=1 'c<a{print b" "[=11=]; c+=1} c==a{c=0;b+=1}' file.dat > file.dat2
date
./lanza.sh
EXEC1
jueves, 7 de mayo de 2015, 22:01:17 CEST
jueves, 7 de mayo de 2015, 22:02:41 CEST
jueves, 7 de mayo de 2015, 22:04:09 CEST
EXEC2 (REVERSE ORDER FOR AWKS IN lanza.sh)
jueves, 7 de mayo de 2015, 22:07:56 CEST
jueves, 7 de mayo de 2015, 22:09:24 CEST
jueves, 7 de mayo de 2015, 22:11:01 CEST
EXEC3 (REVERSE ORDER FOR AWKS IN lanza.sh)
jueves, 7 de mayo de 2015, 22:12:14 CEST
jueves, 7 de mayo de 2015, 22:13:57 CEST
jueves, 7 de mayo de 2015, 22:15:20 CEST
$ wc -l file.dat
30522352 file.dat
$ wc -l file.dat1
30522352 file.dat1
$ wc -l file.dat2
30522352 file.dat2
可以看出,使用模块 (%) 运算符(使用@Ed Morton 的代码),两个代码的性能差异约为 5%-10%。可能需要更多检查,但第一次尝试时差异非常显着!
equal or minus comparator times -> 1m28s, 1m37s, 1m43s
module (%) comparator times -> 1m24s, 1m28s, 1m33s
$ awk -v x=3 '{print (NR%x?c+1:++c), [=10=]}' file
1 jeriro ieieie ieiue
1 ieirirp wzwezeg
1 ieueujueu ueuuwiuyh
2 iejejrökx lek
2 kejejhejhe pmys
2 krejrjhrjh hegehe
3 ririrjfjf
3 iririr iezete
3 pgogto
$ awk -v x=4 '{print (NR%x?c+1:++c), [=10=]}' file
1 jeriro ieieie ieiue
1 ieirirp wzwezeg
1 ieueujueu ueuuwiuyh
1 iejejrökx lek
2 kejejhejhe pmys
2 krejrjhrjh hegehe
2 ririrjfjf
2 iririr iezete
3 pgogto
perl -ne 'print 1+int(($.-1)/4) ," $_"'
或
perl -ne 'printf "%d %s", (3+$.)/4 ,$_'
awk -v Cycle=3 '{print int((NR+Cycle-1)/Cycle), [=10=]}' YourFile
# or
awk -v Cycle=3 '{printf '%d %s\n' (NR+Cycle-1)/Cycle, [=10=]}' YourFile
#simplified for 3
awk '{print int((NR+2)/3), [=10=]}' YourFile