我正在解析Wikipedia表。该表包含以下数据
CLASSPATH
我希望有一个正则表达式(可以在终端中执行,最好是sed或类似的东西),可以将任意N行数字移动到上述A-Z国家/地区名称
预期输出为:
Tonga
0
Trinidad and Tobago
10
14
24
Tunisia
10
6
16
Turkey
12
14.5
26.5
我还没有接近,这是我的最大努力。感谢您的光临
Tonga,0
Trinidad and Tobago,10,14,24
Tunisia,10,6,16
Turkey,12,26.5
产生
perl -pe 's/^[0-9]*$/\n,/g'
这是不正确的,因为我要用
,
Trinidad and Tobago
,
,
,
Tunisia
,
,
,
Turkey
,
14.5
26.5
替换,并且需要用其他内容替换\n
。不幸的是,我不知道是否可以将\n
与sed / perl匹配
我尝试了\n
,但是我又不知道如何在输出中保持匹配。它将所有字符替换为
tr
产生
tr 'A-z\n' ','
答案 0 :(得分:4)
$ awk '{printf "%s%s", (/^[0-9]/ ? "," : s), $0; s=ORS} END{print ""}' file
Tonga,0
Trinidad and Tobago,10,14,24
Tunisia,10,6,16
Turkey,12,14.5,26.5
答案 1 :(得分:2)
请您尝试以下。
awk 'BEGIN{OFS=","}/^[a-zA-Z]+/ && val{print val;val=""} {val=val?val OFS $0:$0} END{if(val){print val}}' Input_file
说明:
awk '
BEGIN{ ##Starting BEGIN section here.
OFS="," ##Setting output field seprator as comma here.
}
/^[a-zA-Z]+/ && val{ ##Checking condition if a line starts with alphabet and variable val is not null.
print val ##Printing variable val here.
val=""
}
{
val=(val?val OFS:"")$0 ##Creating variable val and concatenating its value to its own for each line value.
}
END{ ##Starting END block for this awk code.
if(val){ ##Checking if val is NOT NULL.
print val ##Then printing val here.
}
}' Input_file ##Mentioning Input_file name here.
答案 2 :(得分:2)
还有一个PL/JSON
解决方案:
sed
想法是将每个零件保存到存放空间中,然后关闭并用sed -n -e '/[a-zA-Z]/{' -e 'x;/./s/\n/,/gp;x;h;}' -e '/^[0-9][0-9.]*$/H;${' -e 'x;/./s/\n/,/gp;}' file
替换\n
并打印。
答案 3 :(得分:1)
另一种awk
解决方案:
awk '/[a-zA-Z]/{if(FNR>1)print "";printf "%s",$0} $0+0==$0{printf ",%s",$0} END{print ""}' file
答案 4 :(得分:0)
通过perl 5,您在“表”中的数据;
$ perl -lpe 'BEGIN{undef $/} s/\n(?!$)/,/g; s/(?<=\d),([a-z])/\n$1/ig' table
或
$ perl -lpe 'BEGIN{undef $/} s/\n/,/g; s/([a-z ]+(,[\d.]+)*),/$1\n/ig' table