Shell脚本用于在每行的第一个单词之后修剪特定长度后的字符

时间:2012-01-03 02:11:56

标签: shell awk

我正在编写一个shell脚本来执行以下任务。 我有这样一个文件:

abcdfgfehg   124353552455
ldnaslbbdaj    134314314344
sdsdbbdbu    134134134314
auosdbo   141413434444
ihjidiqwdnowqdn  134134141232

我希望输出文件是

abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo   141413434444
ihjidiqwd 134134141232

也就是说,所有名称(每行中的第一个单词)应减少为9个字符并修剪剩余的字符。之后的空间。然后是名称的值。

我知道awk命令打印出evry line的第一个单词。

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

但是如何修剪文件中的字符,使每个单词的长度为9,其值在空格后开始。

3 个答案:

答案 0 :(得分:1)

一个简单的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

答案 1 :(得分:0)

您不必使用子字符串。

[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处理宽度和精度。

答案 2 :(得分:0)

> awk '{print substr($1,1,9),$2}' temp
abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo 141413434444
ihjidiqwd 134134141232