2014-12-06 61 views
0

我有一列文件,其列中有不同数量的空格分隔的列。你可以sed或类似这样,每列由一个空格或制表符分隔?用单个空格替换文件中的不同数量的空格

我想:

sed 's/ \+ /\t/g' file > tmp 
sed "s/\ /\t/g" tmp > file 

但[R抱怨

line 526 did not have 11 elements 

回答

3

你可以使用tr

tr -s < fileName 

sed

sed -e 's/ \+/ /g' fileName 

内嵌的sed

sed -i.bak -e 's/ \+/ /g' fileName 
+0

干杯!并感谢多个答案 – cianius 2014-12-06 01:14:39

+0

'tr'命令中我没有'-s'选项,我的tr版本是''tr'(GNU coreutils)8.4'在'centOS'上运行,你能分享你的'tr'版本吗? – BMW 2014-12-07 01:14:34

2

尝试:

sed 's/ \{1,\}/\t/g' file > tmp 

这需要一个或多个空格和转换为在表达式( '\ T' 在这里)的第二部分的字符串。

+0

+ 1欢迎来到本网站。你也可以指定“-i” – Khanna111 2014-12-06 00:46:32

+0

谢谢! -i选项很有用,但要小心提供创建备份所需的后缀。易于用-i单独覆盖单个副本。 – economy 2014-12-06 00:51:59

0

比方说您有一个名为“raw_file”有以下内部

COLUMN1   COLUMN2   COLUMN3  COLUMN4 
I  am a boy 
Hello word 

I   see you 
I am 5 years 
How are you? 

文本您可以使用命令文件:

sed 's/ \{1,\}/ /g' '/root/Desktop/raw_file' |column -s ' ' -t > '/root/Desktop/my_new_file' 

结果时,输出到一个新文件名为“ my_new_file”

COLUMN1 COLUMN2 COLUMN3 COLUMN4 
I  am  a  boy 
Hello word 
I  see  you 
I  am  5  years 

个结果时使用输出到终端

命令:

sed 's/ \{1,\}/ /g' '/root/Desktop/raw_file' |column -s ' ' -t 2> /dev/null 

结果:

COLUMN1 COLUMN2 COLUMN3 COLUMN4 
I  am  a  boy 
Hello word 
I  see  you 
I  am  5  years 

注:每一列被两个空格分隔。

0

awk将直接照顾空白的,容易

awk '$1=$1' infile  # convert to single space 

or 

awk '$1=$1' OFS="\t" infile  # convert to single tab 

如果你必须使用SED,字符类\s将匹配空白字符tabspace

让你的sed的代码可以是固定的作为

sed 's/\s\{1,\}/ /g' infile 

or 

sed 's/\s\{1,\}/\t/g' infile 

如果你的sed支持-r选项,

sed -r 's/\s+/ /g' infile 

or 

sed -r 's/\s+/\t/g' infile 
相关问题