Answers:
使用tr
,请使用s
queeze repeat选项:
$ 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
rebuild $0
会将所有字段合并在一起,并以分隔OFS
,默认情况下为空格。
这会将空格和制表符的序列(以及其他空白字符,取决于的语言环境和实现awk
)压缩到一个空格中,而且还删除了每一行的前导和尾随空格。
awk
,他可以做任何事情。您也可以接受他的解决方案。仅一件事:Gnouc您能否解释命令中的awk格式是什么?您还可以添加制表符/空格以使输出符合Unknown的预期输出吗?
column -t
这样输出。添加有关的说明awk
。
tr
会将一行末尾的两个空格替换为一个空格。awk
将删除所有尾随空格。
column -t f1.txt | cut -d " " -f2
但我没有想到解决方案
column -t file | awk '{print $2}'
仅打印第二列
如果要压缩“空白”,则需要使用tr的预定义字符集“:blank:”(水平空白标签和空格)或“:space:”(垂直空白):
/bin/echo -e "val1\t\tval2 val3" | tr -s "[:blank:]"
示例在Red Hat 5(GNU tr)上运行。
在我的情况下,我想将所有空格标准化为一个空格,以便可以依赖于该空格作为发送器。
正如dastrobu的第二条评论所指出的,我错过了手册页中的措辞:
-s uses the last specified SET, and occurs after translation or deletion.
这使我们消除了第一时间。工藤面对我的密集,耐心等待。
之前,从Redis config解析端口。文件:
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个空格分隔。挤压后,此序列仍然存在。在八进制转储的输出中,这由ascii序列040 011 040表示。
tr "[:blank:]" " " | tr -s "[:blank:]"
吗?我猜第一部分就足够了,即tr "[:blank:]" " "
因为它规范了空白并且已经进行了替换。在手册页中:“挤压多个出现的字符[...]在所有删除和翻译完成后发生。
printf 'ID \t Name\n' | tr -s "[:blank:]" " " | od -cb
(按照@dastrobu的建议),得到了ID Name\n
(只有一个空格)作为输出。您是否真的尝试过@ user3183018?
printf 'ID \t Name\n' | od -cb
,它确切地表明了它的预期目标I
D
\t
N
a
m
e
\n
(即 I
D
040
011
040
N
a
m
e
\n
)。同时,根据您自己的证据,您正在犯完全我所猜测的错误:您正在运行tr -s "[:blank:]"
(即 tr
具有一个选项和 一个参数),而不是我和@dastrobu现在已经提出四次的命令:tr -s '[:blank:]' '␣'
(即, tr
具有一个选项和 两个参数)。
谁需要一个程序(外壳程序除外)?
while read a b
do
echo "$a $b"
done < f1.txt
如果您希望第二列中的值对齐(如polym的column
答案),请使用printf
代替echo
:
while read a b
do
printf '%-2s %s\n' "$a" "$b"
done < f1.txt
tr
调用的微不足道的成本-更不用说要写多少工作了。最后,您不是说这篇文章实际上并没有回答所问的问题吗?仅使用tr用一个空格替换所有空格的最佳方法是什么?
$IFS
吗?也许喜欢:IFS=' <tab>' set -f ; echo $(cat <file)
?