各フィールドの長さが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
1つがある場合は、変数を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