web-dev-qa-db-ja.com

'tr'のみを使用して、複数のスペースを1つに置き換えます

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

ID     Name
1      a
2         b
3   g
6            f

スペースの数はnot固定です。 trのみを使用して、すべての空白を1つのスペースに置き換える最善の方法は何ですか?

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

cat f1.txt | tr -d " "

しかし、出力は次のとおりです。

IDName
1a
2b
3g
6f

しかし、私はそれを次のように見せたいです:

ID Name
1 a
2 b
3 g
6 f

sedを試して回避してください。

77
gkmohit

trでは、 squeeze 繰り返しオプションを使用します。

$ 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の実装に応じてその他の空白文字)が1つのスペースに詰め込まれますが、各行の先頭と末尾の空白も削除されます。

112
cuonglm

column を使用するだけです:

column -t inputFile

出力:

ID  Name
1   a
2   b
3   g
6   f
21
polym

「空白」を絞りたい場合は、trの事前定義された文字セット ":blank:"(水平空白タブとスペース)または ":space:"(垂直空白)を使用します。

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

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

私の場合、すべての空白を単一のスペースに正規化して、スペースをDelmitterとして信頼できるようにしたいと考えました。

Dastrobuの2番目のコメントで指摘されているように、manページの文言を見逃しました。

 -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

その後、squeezeでSET2を指定します。

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

出力:

6379

空白のニュアンスをカバーする詳細について

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

 /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形式の2つの文字列フィールドは、1つのスペース、1つのタブ、1つのスペースで区切られています。絞り込んでも、このシーケンスはまだ存在しています。 Octalダンプの出力では、これはASCIIシーケンス040 011 040で表されます。

10
user3183018

シェル以外のプログラムが必要なのは誰ですか?

while read a b
do
    echo "$a $b"
done < f1.txt

Polymのcolumnの回答のように、2列目の値を揃える場合は、printfではなくechoを使用します。

while read a b
do
    printf '%-2s %s\n' "$a" "$b"
done < f1.txt
6
Scott

これは古い質問であり、何度も解決されました。完全を期すために:私は同じ問題を抱えていましたが、パイプを介して行を別のプログラムに渡したいと思っていました。 xargsを使用しました。

-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はあなたが望むものを正確に出力するようです。

2
Martin Seitl