Shell脚本,用于从每行的第一个字开始修剪特定长度后的字符

Shell脚本,用于从每行的第一个字开始修剪特定长度后的字符,shell,awk,Shell,Awk,我正在编写一个shell脚本来执行以下任务。 我有这样一个文件: abcdfgfehg 124353552455 ldnaslbbdaj 134314314344 sdsdbbdbu 134134134314 auosdbo 141413434444 ihjidiqwdnowqdn 134134141232 我希望输出文件是 abcdfgfeh 124353552455 ldnaslbbd 134314314344 sdsdbbdbu 134134134314 auosd

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

abcdfgfehg   124353552455
ldnaslbbdaj    134314314344
sdsdbbdbu    134134134314
auosdbo   141413434444
ihjidiqwdnowqdn  134134141232
我希望输出文件是

abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo   141413434444
ihjidiqwd 134134141232
也就是说,所有名称(每行中的第一个单词)应减少到9个字符,其余字符应修剪。再过一段时间。然后是名称的值

我知道awk命令打印evry行的第一个字

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

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

一个简单的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
[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
测试2:

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

您不必使用子字符串

[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

请看一下杰帕尔的回答。您可以使用printf处理宽度和精度。

这可能适合您:

> awk '{print substr($1,1,9),$2}' temp
abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo 141413434444
ihjidiqwd 134134141232
sed 's/\S /&         /g;s/\(.\{9\}\)\S*\s*/\1 /' file
abcdfgfeh 124353552455
ldnaslbbd 134314314344
sdsdbbdbu 134134134314
auosdbo   141413434444
ihjidiqwd 134134141232

谢谢它确实奏效了。但是如果我有一个像ABCD这样的值,而不是12324,那么它会打印0。如何纠正?不用担心,只要用
%s
代替
%d
(我已经更新了答案),如果第二列不是数字而是
ABCD
,它就能处理。你可以使用
宽度和
精度来处理缩进,看了你的答案,然后明白了。我想如果我再次改变我的答案,就像复制你的答案一样。所以,我还是保持原样。