Substring apenas a primeira coluna no awk

3

Eu quero pegar os primeiros 500 caracteres da primeira coluna e deixar o resto das colunas como estão, usando o awk.

Isso é o que estou tentando fazer:

awk '{print ${$1:1:500} $2,$NF;}' doc.txt

Mas recebo um erro de sintaxe:

awk: {print ${$1:1:500} $2,$NF;}
awk:         ^ syntax error
awk: {print ${$1:1:500} $2,$NF;}
awk:                           ^ syntax error
    
por Lenin Raj Rajasekaran 30.12.2013 / 08:19

2 respostas

12

Você está tentando passar (inválido) a sintaxe do subscrito do bash para o awk, não tenho certeza de como espera que isso funcione.

awk '{ $1 = substr($1, 1, 500) } 1'

1 é apenas uma maneira de retornar true para que awk imprima a linha, substr() é a chamada real que faz a substring. Da documentação:

substr(string, start, length)

This returns a length-character-long substring of string, starting at character number start. The first character of a string is character number one.

For example, substr("washington", 5, 3) returns "ing". If length is not present, this function returns the whole suffix of string that begins at character number start. For example, substr("washington", 5) returns "ington". This is also the case if length is greater than the number of characters remaining in the string, counting from character number start.

Se você precisar manter o separador de campo, defina OFS apropriadamente.

    
por 30.12.2013 / 08:31
3

Aqui você vai:

awk '{$1 = substr($1, 1, 500)} 1'

Infelizmente, isso tem o inconveniente de estragar os separadores de campo entre os campos, por exemplo, considere isto:

$ ls -l | awk '{print}'
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

Se eu usar minha resposta para manter apenas os 3 primeiros caracteres do primeiro campo, recebo:

$ 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

O espaço em branco original entre todos os campos é substituído por um espaço simples. Se isso é um problema para você, então você pode tentar algo assim:

$ ls -l | awk '{$0 = substr($1, 1, 3) substr($0, length($1) + 1)} 1'
tot 88
-rw 1 jack jack  4668 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
    
por 30.12.2013 / 08:31

Tags