如果行小于固定长度,如何在行的中间添加空格



如果任何一行的长度小于固定长度(10(,我想在文本文件的中间添加空格。空格的位置固定在第4个字符之后。

文件如下:

ABCEFGH  K<— length: 10
ABCDE  FGH<- length: 10
ABCD  EFG<- length: 9
ABCDE FGH<- length: 9
ABCDE<-length: 5

期望输出:

ABCEFGH  K<— length: 10
ABCDE  FGH<- length: 10
ABCD   EFG<- length: 10
ABCD  EFGH<- length: 10
ABCD     E<- length: 10

我真的是个新手。我尝试过使用awk和sed这样的方法,如果行长度小于固定长度,则附加0。它非常完美,但我想实现的是在给定的位置添加空白,从而修改原始文件。

我很感激你的真知灼见!

我尝试过的方法:<https://stackoverflow.com/questions/46443750/appending-0s-to-a-file-in-unix-bash-if-the-line-is-less-than-a-fixed-length/46443954>

更新:

awk '{ if(length<10) printf "%s%0*dn",$0,10-length,0; else print }' test.txt

这是我尝试过的来自上面链接的代码。由于我不知道如何在中间添加空格,并保持每一行的固定长度,所以我无法提供代码。我为没有提供代码而道歉。

$ awk -v tgt=10 'length($0)<tgt{gsub(/ /,""); $0=substr($0,1,4) sprintf("%*s",tgt-length($0),"") substr($0,5)} 1' file
ABCEFGH  K
ABCDE  FGH
ABCD   EFG
ABCD  EFGH
ABCD     E

您可以使用这样的东西:

$ awk -v l=10 -v i=4 'length($0)>=l{print; next}
{
gsub(/ /,"")
s1=substr($0,1,i)
s2=substr($0,i+1,length($0))
printf "%s%*s%sn",s1,l-length($0)," ",s2
}' file

其中CCD_ 1是目标长度并且CCD_ 2是插入点。

打印:

ABCEFGH  K
ABCDE  FGH
ABCD   EFG
ABCD  EFGH
ABCD     E

请参阅本指南,了解如何提出好的问题。

sed可以做到这一点。

$: cat tst
ABCEFGH  K
ABCDE  FGH
ABCD  EFG
ABCDE FGH
ABCDE
ABCD
ABC
AB
A

$: sed -E '/^.{1,9}$/{
/ [^ ]/{ s/$/          /; s/^(.{10}).*/1/; s/^([^ ]*)( +)([^ ]+)( *)/1243/;  }
/^[^ ]+$/{ s/ //g; s/$/          /; s/^(.{10}).*/1/; s/^(.*)([^ ])( *)$/132/; }
}' tst
ABCEFGH  K
ABCDE  FGH
ABCD   EFG    
ABCDE  FGH
ABCD     E
ABC      D
AB       C
A        B
A
awk -F< '{ split($1,map," "); # Set the field delimiter to < and then split the first field into array map using space as the delimiter
diff=10-length(map[1])-length(map[2]); # Work out the number of spaces to pad out to.
printf "%s",map[1]; # Print the first field up to first space
for (i=1;i<=diff+1;i++) { 
printf "%s"," " # Loop to the diff count (padding), adding spaces
} 
printf "%s",map[2]; # Print the section of the first field after the spaces
printf "<- length:%sn","10" 
}' file

一个衬垫:

awk -F< '{ split($1,map," ");diff=10-length(map[1])-length(map[2]);printf "%s",map[1];for (i=1;i<=diff+1;i++) { printf "%s"," " } printf "%s",map[2];printf "<- length:%sn","10" }' file

我将使用AWK按照以下方式进行操作,让file.txt内容为

ABCEFGH  K
ABCDE  FGH
ABCD  EFG
ABCDE FGH
ABCDE

然后

awk 'BEGIN{for(i=1;i<=10;i+=1){arr[i]=arr[i-1] " "}}{x=10-length($1)-length($2);print $1 arr[x] $2}' file.txt

输出

ABCEFGH  K
ABCDE  FGH
ABCD   EFG
ABCDE  FGH
ABCDE     

说明:首先在BEGIN中,我准备了arrarr[1]是一个空间,arr[2]是两个空间,依此类推,然后对于每一行,我通过计算10减去第一部分的长度减去第二部分的长度来计算需要多少空间。然后,我打印使用所需数量的空格连接的零件。

(在GNU Awk 5.0.1中测试(

最新更新