使用处理输入时awk
,有时我想编辑其中一个字段,而无需触摸其他任何内容。考虑一下:
$ ls -l | awk 1
total 88
-rw-r--r-- 1 jack jack 8 Jun 19 2013 qunit-1.11.0.css
-rw-r--r-- 1 jack jack 56908 Jun 19 2013 qunit-1.11.0.js
-rw-r--r-- 1 jack jack 4306 Dec 29 09:16 test1.html
-rw-r--r-- 1 jack jack 5476 Dec 7 08:09 test1.js
如果我不修改任何字段($1
,$2
,...),一切都因为它是保存。但是,如果我只想保留第一个字段的前三个字符:
$ ls -l | awk '{$1 = substr($1, 1, 3) } 1'
tot 88
-rw 1 jack jack 8 Jun 19 2013 qunit-1.11.0.css
-rw 1 jack jack 56908 Jun 19 2013 qunit-1.11.0.js
-rw 1 jack jack 4306 Dec 29 09:16 test1.html
-rw 1 jack jack 5476 Dec 7 08:09 test1.js
所有字段之间的原始空格将替换为简单的空格。
有没有办法保留字段之间的原始空白?
更新
在此示例中,编辑前4个字段相对容易。但是如果我只想保留第一个字母$5
以获取此输出怎么办:
-rw-r--r-- 1 jack jack 8 J 19 2013 qunit-1.11.0.css
-rw-r--r-- 1 jack jack 56908 J 19 2013 qunit-1.11.0.js
-rw-r--r-- 1 jack jack 4306 D 29 09:16 test1.html
-rw-r--r-- 1 jack jack 5476 D 7 08:09 test1.js
我知道这是一个老问题,但我认为必须有更好的选择。该答案适用于在搜索时偶然发现此问题的人。在网上浏览时,我不得不说@HåkonHægland是最好的答案,这是我最初使用的。
但是这是我的解决方案。使用FPAT。它可以设置一个正则表达式来说明字段应该是什么。
FPAT = "([[:space:]]*[[:alnum:][:punct:][:digit:]]+)";
在这种情况下,我要说的是该字段应以零个或多个空白字符开头,并以除空白字符以外的基本上任何其他字符结尾。 如果您在理解方括号表达式时遇到困难,请使用 以下 链接 POSIX
。
另外,将输出字段更改为OFS = "";
分隔符,因为一旦对行进行了操作,如果您不更改默认值的OFS,输出将添加一个额外的空格作为分隔符。
我使用相同的示例进行测试。
$ cat example-output.txt
-rw-r--r-- 1 jack jack 8 Jun 19 2013 qunit-1.11.0.css
-rw-r--r-- 1 jack jack 56908 Jun 19 2013 qunit-1.11.0.js
-rw-r--r-- 1 jack jack 4306 Dec 29 09:16 test1.html
-rw-r--r-- 1 jack jack 5476 Dec 7 08:09 test1.js
$ awk 'BEGIN { FPAT = "([[:space:]]*[[:alnum:][:punct:][:digit:]]+)"; OFS = ""; } { $6 = substr( $6, 1, 2); print $0; }' example-output.txt
-rw-r--r-- 1 jack jack 8 J 19 2013 qunit-1.11.0.css
-rw-r--r-- 1 jack jack 56908 J 19 2013 qunit-1.11.0.js
-rw-r--r-- 1 jack jack 4306 D 29 09:16 test1.html
-rw-r--r-- 1 jack jack 5476 D 7 08:09 test1.js
记住。字段现在有前导空格。因此,如果该字段需要替换为其他内容,则可以执行
len = length($1);
$1 = sprintf("%"(len)"s", "-42-");
$ awk 'BEGIN { FPAT = "([[:space:]]*[[:alnum:][:punct:][:digit:]]+)"; OFS = ""; } { if(NR==1){ len = length($1); $1 = sprintf("%"(len)"s", "-42-"); } print $0; }' example-output.txt
-42- 1 jack jack 8 Jun 19 2013 qunit-1.11.0.css
-rw-r--r-- 1 jack jack 56908 Jun 19 2013 qunit-1.11.0.js
-rw-r--r-- 1 jack jack 4306 Dec 29 09:16 test1.html
-rw-r--r-- 1 jack jack 5476 Dec 7 08:09 test1.js
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句