Shell脚本,用于从每行的第一个字开始修剪特定长度后的字符
我正在编写一个shell脚本来执行以下任务。 我有这样一个文件:Shell脚本,用于从每行的第一个字开始修剪特定长度后的字符,shell,awk,Shell,Awk,我正在编写一个shell脚本来执行以下任务。 我有这样一个文件: abcdfgfehg 124353552455 ldnaslbbdaj 134314314344 sdsdbbdbu 134134134314 auosdbo 141413434444 ihjidiqwdnowqdn 134134141232 我希望输出文件是 abcdfgfeh 124353552455 ldnaslbbd 134314314344 sdsdbbdbu 134134134314 auosd
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
,它就能处理。你可以使用宽度和精度来处理缩进,看了你的答案,然后明白了。我想如果我再次改变我的答案,就像复制你的答案一样。所以,我还是保持原样。