我有一个固定长度的矩阵类型文件,其中每个字段的长度为 20 个字符。
- 如何将其转换为空格分隔的文件?
另外还有一些缺失值,我想用连字符 ( -
) 替换。
- 我怎样才能做到这一点?
我将使用输出进行awk
操作。
具有 10 个字符字段长度的文件的示例输入。
head1 head2 head3
a b c
c
c a
输出示例
head1 head2 head3
a b c
- c -
c - c
答案1
珀尔:
perl -ne '
BEGIN {$width = 10}
while (length) {
($word = substr($_,0,$width)) =~ s/^\s+|\s+$//g; # trim whitespace
$word ||= "-";
print $word, " ";
substr($_,0,$width) = "";
}
print "\n";
' file
答案2
这对我有用:
sed 's/^ //g' input | tr -s "[:blank:]" "," | \
awk -F, '!$1{printf "- "} $1{printf "%s ", $1} \
!$2{printf "- "} $2{printf "%s ", $2} \
!$3{print "-"} $3{print $3}'
解释:
sed 's/^ //g' input
删除前导空格(如果存在)tr -s "[:blank:]" ","
: 用逗号替换所有空格awk ...
:使用分隔符,
并打印值,或者-
如果值为空则打印。
答案3
awk方式
awk '{for(x=0;x<length($0);x+=10)y=y" "((z=substr($0,x,10))~/[[:graph:]]/?z:"-")
gsub(/ +/," ",y);print y;y=""}' file
如果他们可以在字段中留有空格
awk '{for(x=0;x<length($0);x+=10){z=gensub(/(^ +| +$)/,"", "g",substr($0,x,10))
y=y" "(z?z:"-")}print y;y=""}' file
答案4
如果你有,gawk
那么你可以使用FIELDWIDTHS
变量来告诉gawk
如何用固定的柱状边界分割输入。这是一个实验性功能。分配给覆盖用于字段分割FIELDWIDTHS
的使用。FS
这是用法示例,
gawk 'BEGIN{
FIELDWIDTHS = "10 10 10"
}
{
s = q = ""
for(i=1;i<=NF;i++)
{
s = $i
gsub(/ +/,"",s)
s = (length(s) )? s : "-"
q = sprintf("%s%s%s",q,(length(q)?OFS:""),s)
}
print q
}
' file