如果任何一行的长度小于固定长度(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
中,我准备了arr
,arr[1]
是一个空间,arr[2]
是两个空间,依此类推,然后对于每一行,我通过计算10减去第一部分的长度减去第二部分的长度来计算需要多少空间。然后,我打印使用所需数量的空格连接的零件。
(在GNU Awk 5.0.1中测试(