Chinaunix
标题:
请教如何将含多个单词空格隔开的名词看做一个域来操作
[打印本页]
作者:
bmechuangye
时间:
2015-06-26 03:08
标题:
请教如何将含多个单词空格隔开的名词看做一个域来操作
$head dat.txt
ALGERIA 36.4 14.6
CONGO 37.3 8.0
EGYPT 42.1 15.3
GHANA 55.8 25.6
IVORY COAST 56.1 33.1
MALAGASY 41.8 15.8
MOROCCO 46.1 18.7
TUNISIA 41.7 10.1
CAMBODIA 41.4 19.7
CEYLON 35.8 8.5
像上面的数据中,实质上只有三列,每行的域分隔符为不等的空格,但有一点是第一个域可能为多个空格隔开的名词,比如:
IVORY COAST 56.1 33.1
现在要做到将三列以‘\t’制表符隔开,而不再是不等的空格隔开。现在我只能对后面数字列做到这样,请问各位如何整个做到这一点。
$ cat dat.txt|tr -s ' ' |awk 'BEGIN{OFS="\t"}{print $(NF-2), $(NF-1), $NF}'|head
ALGERIA 36.4 14.6
CONGO 37.3 8.0
EGYPT 42.1 15.3
GHANA 55.8 25.6
COAST 56.1 33.1 ## 实际应为: IVORY COAST 56.1 33.1
MALAGASY 41.8 15.8
MOROCCO 46.1 18.7
TUNISIA 41.7 10.1
CAMBODIA 41.4 19.7
CEYLON 35.8 8.5
dat.txt.tar.gz
2015-06-26 02:54 上传
点击文件名下载附件
912 Bytes, 下载次数: 12
data
作者:
jason680
时间:
2015-06-26 04:24
回复
1#
bmechuangye
$ awk '{
OFS="\t";$1=$1;
if(
NF>3
){
$1=$1" "$2
;$2=$3;$3=$4;NF=3
}}1' FILE
ALGERIA 36.4 14.6
CONGO 37.3 8.0
EGYPT 42.1 15.3
GHANA 55.8 25.6
IVORY COAST 56.1 33.1
MALAGASY 41.8 15.8
MOROCCO 46.1 18.7
TUNISIA 41.7 10.1
CAMBODIA 41.4 19.7
CEYLON 35.8 8.5
作者:
bmechuangye
时间:
2015-06-26 05:11
本帖最后由 bmechuangye 于 2015-06-26 05:12 编辑
回复
2#
jason680
非常感谢jason680!
有个问题想问一下,就是这一行命令最后那个“1”是什么意思?我试了试,1改成其它数字结果都不变,为什么?
作者:
jason680
时间:
2015-06-26 05:24
回复
3#
bmechuangye
awk初学之常见问题
http://bbs.chinaunix.net/thread-2309494-1-1.html
1. awk ‘{code}
1
’ 中的
“1”是干什么的?
作者:
bmechuangye
时间:
2015-06-26 05:33
回复
4#
jason680
谢谢您!
作者:
reyleon
时间:
2015-06-26 09:56
@jason680
@bmechuangye
你们大半夜不睡觉的么?
作者:
hjfeng1988
时间:
2015-06-26 10:24
awk -vFS=" +" -vOFS="\t" '$1=$1' file
复制代码
不是很严谨,其实楼主半夜不睡觉很正常,但是680大神大半夜不睡觉就不合理了
作者:
bmechuangye
时间:
2015-06-27 05:30
回复
7#
hjfeng1988
谢谢,很精练。您好,-vFS=" +" 这个是一个以上空格不包括一个空格的意思吗?
作者:
hjfeng1988
时间:
2015-06-27 09:49
回复
8#
bmechuangye
+是一个或一个以上," +"就是两个或者两个以上的空格
作者:
bmechuangye
时间:
2015-06-27 09:56
回复
9#
hjfeng1988
谢谢hjfeng1988!
作者:
maple412
时间:
2015-06-27 11:20
BEGIN{
OFS="\t"
}
{
if(NF == 4)
{
$1=$1" "$2
$2=$3
$3=$4
}
print $1,$2,$3
}
作者:
substr函数
时间:
2015-06-27 14:25
本帖最后由 substr函数 于 2015-06-27 14:29 编辑
数据有三列就是
#!/usr/bin/python2
# coding: utf-8
FILE = open('dat.txt')
for line in FILE:
elems = line.split()
head = ' '.join(elems[:-2])
print '\t'.join([head] + elems[-2:])
FILE.close()
复制代码
作者:
bmechuangye
时间:
2015-07-01 08:16
谢谢! @maple412、@substr函数
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2