Скрипт оболочки для обрезки символов после определенной длины от 1-го слова каждой строки - PullRequest
3 голосов
/ 03 января 2012

Я пишу сценарий оболочки для выполнения следующей задачи. У меня есть файл, подобный этому:

abcdfgfehg   124353552455
ldnaslbbdaj    134314314344
sdsdbbdbu    134134134314
auosdbo   141413434444
ihjidiqwdnowqdn  134134141232

Я хочу, чтобы выходной файл был

abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo   141413434444
ihjidiqwd 134134141232

То есть все имена (1-е слово в каждой строке) должны быть сокращены до 9 символов, а оставшиеся символы обрезаны. Пробел после этого. а затем значение имени.

Я знаю, что команда awk печатает 1-е слово в каждой строке.

awk '{print $1}' ./input.txt

Но как урезать символы из файла, чтобы каждое слово имело длину 9, а его значение начиналось с пробела.

Ответы [ 4 ]

1 голос
/ 03 января 2012

Простой printf сделает -

awk '{printf ("%-10.9s%s\n", $1,$2)}' file

Тест:

[jaypal:~/Temp] awk '{printf ("%-10.9s%s\n", $1,$2)}' file
abcdfgfeh 124353552455 
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo   141413434444
ihjidiqwd 134134141232

Тест 2:

[jaypal:~/Temp] cat file
abcdfgfehg   1243535ABCD55
ldnaslbbdaj    134314314344
sdsdbbdbu    134134134314
auosdbo   141413434444
ihjidiqwdnowqdn  134134141232

[jaypal:~/Temp] awk '{printf ("%-10.9s%s\n", $1,$2)}' file
abcdfgfeh 1243535ABCD55
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo   141413434444
ihjidiqwd 134134141232
0 голосов
/ 04 января 2012

Это может работать для вас:

sed 's/\S /&         /g;s/\(.\{9\}\)\S*\s*/\1 /' file
abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo   141413434444
ihjidiqwd 134134141232
0 голосов
/ 03 января 2012
> awk '{print substr($1,1,9),$2}' temp
abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo 141413434444
ihjidiqwd 134134141232
0 голосов
/ 03 января 2012

Вам не нужно использовать подстроку.

[srikanth@myhost ~]$ cat sample.txt
abcdfgfehg   124353552455
ldnaslbbdaj    134314314344
sdsdbbdbu    134134134314
auosdbo   141413434444
ihjidiqwdnowqdn  134134141232

[srikanth@myhost ~]$ awk '{ printf("%-.9s %s\n", $1, $2); }' sample.txt 
abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo 141413434444
ihjidiqwd 134134141232

Пожалуйста, взгляните на ответ @ Jaypal. Вы можете обрабатывать ширину и точность с printf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...