ファイルがあります、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
を試して回避してください。
tr
では、 s
queeze 繰り返しオプションを使用します。
$ 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つのスペースに詰め込まれますが、各行の先頭と末尾の空白も削除されます。
「空白」を絞りたい場合は、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で表されます。
シェル以外のプログラムが必要なのは誰ですか?
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
これは古い質問であり、何度も解決されました。完全を期すために:私は同じ問題を抱えていましたが、パイプを介して行を別のプログラムに渡したいと思っていました。 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
はあなたが望むものを正確に出力するようです。