sedを使用して次の入力文字列を出力文字列にフォーマットするにはどうすればよいですか?
中央の文字列は20番目の文字で始まり、最後の文字列は40番目の文字で始まる必要があります。
入力する:
begining center end
beg12 cen12 end12
beg13 cen end
出力:
begining center end
beg12 cen12 end12
beg13 cen end
答え1
awk
その機能を使用してこのデータをフォーマットすることができますprintf()
。
$ awk '{ printf("%-20s%-20s%s\n", $1, $2, $3) }' data.in
begining center end
beg12 cen12 end12
beg13 cen end
これは、ファイルのデータがスペースで区切られていると仮定します。
列の幅をパラメータとして指定します。
$ cols=40
$ awk -v c="$cols" 'BEGIN { fmt=sprintf("%%-%ds%%-%ds%%s\n", c, c) } { printf(fmt, $1, $2, $3) }' data.in
begining center end
beg12 cen12 end12
beg13 cen end
答え2
これはsed
私が使用しない場合の一つです。printf
具体的には、「フィールド」が最小文字数
%-Ns
を占めるまで文字列を空白で埋める形式を使用します。N
#!/usr/bin/env bash
while read first second third
do
printf "%-20s%-20s%s\n" "$first" "$second" "$third"
done <<- 'EOF'
begining center end
beg12 cen12 end12
beg13 cen end
EOF
答え3
アッ方法:
awk '{printf("%-20s%-20s%-20s\n",$1,$2,$3)}' file
出力:
begining center end
beg12 cen12 end12
beg13 cen end
答え4
< yourfile tr -s '\t ' '\t\t' | expand -t 19,39
結果
1 2 3 4 5
12345678901234567890123456789012345678901234567890
begining center end
beg12 cen12 end12
beg13 cen end
布材
- まず、残りのスペースおよび/またはタブ文字をタブ文字に圧縮します。
- 次に、オプションを使用してタブの場所を一覧表示して
expand
結果にコマンドを適用します。-t