複数のスペースを1つに置き換えるには 'tr'を使用してください。

複数のスペースを1つに置き換えるには 'tr'を使用してください。

ファイルがありますf1.txt

ID     Name
1      a
2         b
3   g
6            f

スペースの数はいいえ安定した。すべてのスペースを1つのスペースに置き換える最善の方法は何ですかtr

これが私が今まで持っているものです:

cat f1.txt | tr -d " "

ただし、出力は次のようになります。

IDName
1a
2b
3g
6f

しかし、私は次のように見えたいです。

ID Name
1 a
2 b
3 g
6 f

それを避けてくださいsed

答え1

とともにtr、使用するs押出繰り返しオプション:

$ tr -s " " < file
ID Name
1 a
2 b
3 g
6 f

または、次のソリューションを使用できますawk

$ awk '{$2=$2};1' file
ID Name
1 a
2 b
3 g
6 f

レコードのフィールドを変更すると、書き換えはawkすべて$0のフィールドを取得し、デフォルトでスペースOFSで区切って一緒にリンクします。

これにより、一連のスペースとタブ(ロケールと実装によって異なるスペース文字も可能ですawk)を単一のスペースに圧縮し、各行から先行スペースと末尾スペースを削除します。

答え2

ただ使用column:

column -t inputFile

出力:

ID  Name
1   a
2   b
3   g
6   f

答え3

"空白"を圧縮するには、trの事前定義された文字セット":blank:"(水平スペースタブとスペース)または ":space:"(垂直スペース)を使用する必要があります。

/bin/echo -e  "val1\t\tval2   val3" | tr -s "[:blank:]"

例は Red Hat 5 (GNU tr) で実行されます。

私の場合は、スペースを区切り文字として使用できるように、すべてのスペースを単一のスペースに正規化したいと思います。

dastrobuの2番目のコメントで指摘したように、マニュアルページのフレーズを見逃しました。

 -s uses the last specified SET, and occurs after translation or deletion.

これにより、最初のtrを削除できます。私の不器用な姿に工藤はあまりにも早急だった。

以前は、Redis 設定でポートが確認されました。文書:

grep "^port" $redisconf | tr "[:blank:]" " " | tr -s "[:blank:]"  | cut -d" " -f2

次へを押してSET2を指定します。

grep "^port" $redisconf | tr -s "[:blank:]" " " | cut -d" " -f2

出力:

6379

スペースの微妙な違いの詳細

[:blank:] 文字クラスに属する連続混合文字が含まれている場合、圧着だけでは失敗することを示します。

 /usr/bin/printf '%s \t %s' id myname | tr -s "[:blank:]"  | od -cb
0000000   i   d      \t       m   y   n   a   m   e
        151 144 040 011 040 155 171 156 141 155 145
0000013

注:私のprintf形式には、1つのスペース、1つのタブ、1つのスペースで区切られた2つの文字列フィールドがあります。シーケンスは押出後も持続する。 8進ダンプの出力では、これはASCIIシーケンス040 011 040で表されます。

答え4

これは何度も解決された古い問題です。完全性のために:同様の問題がありますが、他のプログラムにラインをパイプしたいと思います。使ったパラメータ

-L max-lines
   Use at most max-lines nonblank input lines per command line.
   Trailing blanks cause an input line to be logically continued 
   on the next input line.  Implies -x.

したがって、cat f1.txt | xargs -L1出力が正確に欲しいようです。

関連情報