awk打印每行x3次?

时间:2016-01-07 12:08:58

标签: awk

这个awk单行 awk '{lines[NR]=$0}{for(i=0;i<3;i++) print $lines[i]} awk.write

awk.write

this line 1 no un1x
this lines 22 0
butbutbut this 33 22 has unix
but not 1
THIS is not
butbutbut ffff
second line

打印为

this line 1 no un1x
this line 1 no un1x
this line 1 no un1x
this lines 22 0
this lines 22 0
this lines 22 0
butbutbut this 33 22 has unix
butbutbut this 33 22 has unix
butbutbut this 33 22 has unix
but not 1
but not 1
but not 1
THIS is not
THIS is not
THIS is not
butbutbut ffff
butbutbut ffff
butbutbut ffff
second line
second line
second line

然而,似乎$使用的方式与此处的方式不同,因为没有它运行lines[i]我得

this line 1 no un1x


this line 1 no un1x
this lines 22 0

this line 1 no un1x
this lines 22 0

this line 1 no un1x
this lines 22 0

this line 1 no un1x
this lines 22 0

this line 1 no un1x
this lines 22 0

this line 1 no un1x
this lines 22 0

lines[0]返回空结果时,$lines[i]printed as相同的运行结果如$部分所示。有没有更好的方法这样做我不喜欢在这方面使用var app = angular.module('myapp', ['ngSanitize']); app.controller('AddCtrl', function ($scope, $compile) { $scope.field = {name: 'My Name', email:'abc@gmail.com'}; $scope.add_NameField = function (index) { var namehtml = '<fieldset id="name_field" ng-click="selectName($index)"><label ng-bind-html="field.name"></label><input type="text" placeholder="Enter name" name="{{field.name}}"><button ng-click="removeName($index)">-</button>//click here//</fieldset>'; var name = $compile(namehtml)($scope); angular.element(document.getElementById('drop')).append(name); }; $scope.removeName = function (index) { var myEl = angular.element(document.querySelector('#name_field')); myEl.remove(); }; $scope.selectName = function (index) { $scope.showName_Fieldsettings = true; }; $scope.add_EmailField = function (index) { var emailhtml = '<fieldset id="email_field" ng-click="selectEmail($index)"><label ng-bind-html="field.email"></label>//click here//<input type="email" placeholder="Enter email" name="{{field.email}}"><button ng-click="removeEmail($index)">-</button>//click here//</fieldset>'; var email = $compile(emailhtml)($scope); angular.element(document.getElementById('drop')).append(email); }; $scope.removeEmail = function (index) { var myEl = angular.element(document.querySelector('#email_field')); myEl.remove(); }; $scope.selectEmail = function (index) { $scope.showEmail_Fieldsettings = true; }; });。感谢。

3 个答案:

答案 0 :(得分:3)

我会使用sed

sed 'p;p' file

您只需要执行两次p操作,因为sed默认情况下会一次打印该行。

awk可以是:

awk '1;1;1' file

与:

相同
awk '1{print}1{print}1{print}' file

awk '{print}{print}{print}'

或者简单地说:

awk '{print;print;print}' file

答案 1 :(得分:2)

$用于访问单行中的字段,特殊情况为$ 0 bing整行。

发生的事情是lines[i]正在返回一个字符串。 $x要求x为整数。所以字符串被隐式地转换为零,你得到三次$0被打印 - 3 x当前行。

没有它,你会得到第0,1和2行(一旦读完),但是在awk中没有第0行,所以它被打印成一个空行。

答案 2 :(得分:1)

如果您想使用循环重复每一行N次,那么您应该将脚本更改为:

awk '{ for (i=0; i<3; i++) print }' file

使用循环的优点是您可以使用shell变量来定义每行应该打印的次数。你甚至可以把它变成一个shell函数:

repeat_line_n_times() {
    n=$1
    file=$2
    awk -v n="$n" '{ for (i=0; i<n; i++) print }' "$file"
}

repeat_line_n_times 3 file

显然你可以&#34;展开&#34;这个循环并最终得到一个较短的脚本,用于少量的行,但这种方法可以更好地扩展!

如果您希望将每一行存储在一个数组中(从您的示例中可以看出为什么会出现这种情况),那么您应该按如下方式修改脚本:

awk '{ lines[NR] = $0; for (i=0; i<3; i++) print lines[NR] }' file

请注意,所有代码都在同一个{ action }块中。另请注意,我根据您的尝试使用lines[NR]而不是$lines[i]$用于表示awk中的特定字段,因此除非变量包含字段数,否则不应在变量前使用。当然,我只使用lines数组来说明如何正确地执行此操作;正如我在第一个示例中所示,默认print(无参数)在此处有效,因为您正在尝试打印当前记录$0