ファイルがあります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
答え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
出力が正確に欲しいようです。