在 Linux 上使用 bash,如何处理文本文件,以便在特定列之前插入空格,以便列在输出中对齐?例如:
1653455 ASDFASDF22 bla bla bla asd xmv ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl wqe ASDFASDF22 BB
Run Code Online (Sandbox Code Playgroud)
1653455 ASDFASDF22 bla bla bla asd xmv ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl wqe ASDFASDF22 BB
Run Code Online (Sandbox Code Playgroud)
两个ASDFASDF22s之间的列必须少于 50 个字符,否则应该被截断。
一种解决方案使用perl:
script.pl 的内容:
use warnings;
use strict;
## Acept one argumnet, the input file.
@ARGV == 1 or die qq[Usage: perl $0 input-file\n];
while ( <> ) {
## Remove last '\n' char.
chomp;
## Split line with string 'ASDFASDF22'
my @f = split /(ASDFASDF22)/;
## Print line but print first 49 chars plus a space of the special string.
printf qq[%s%-50s%s\n],
join( qq[], @f[0,1] ),
substr( $f[2], 0, 49 ) . qq[ ],
join( qq[], @f[3..$#f] );
}
Run Code Online (Sandbox Code Playgroud)
执行脚本:
perl script.pl infile
Run Code Online (Sandbox Code Playgroud)
和输出:
1653455 ASDFASDF22 bla bla bla asd xmv ASDFASDF22 AA
1944444 ASDFASDF22 klasdfmxvl yxklc erisa ask xdk asdm ase ASDFASDF22 BB
1984945 ASDFASDF22 jklyck aklsdfl asfjasl asdkkcii wdkkkxd aslasl w ASDFASDF22 BB
Run Code Online (Sandbox Code Playgroud)