我有多个文本文件中的数据,如下所示:
1 DAEJ X -3120041.6620 -3120042.0476 -0.3856 0.0014
Y 4084614.2137 4084614.6871 0.4734 0.0015
Z 3764026.4954 3764026.7346 0.2392 0.0014
HEIGHT 116.0088 116.6419 0.6332 0.0017 0.0017 8.0
LATITUDE 36 23 57.946407 36 23 57.940907 -0.1699 0.0013 0.0012 57.5 0.0012 62.9
LONGITUDE 127 22 28.131395 127 22 28.132160 0.0190 0.0012 0.0013 2.3 0.0013我想通过一个过滤器来运行它,这样输出就会如下所示:
DAEJ: 36 23 57.940907, 127 22 28.132160, 116.6419我可以很容易地使用grepWin,通过搜索以下内容来使用命名捕获:
(?<site>\w\w\w\w+)<filler>\r\n\r\n<filler>(?<height>\-?\d+\.\d+)<filler>(?<heightRMS>\d+\.\d+)<filler>\r\n<filler>(?<lat>\-?\ *\d+\ +\d+\ +\d+\.\d+)<filler>(?<latRMS>\d+\.\d+)<filler>\r\n<filler>(?<lon>\-?\ *\d+\ +\d+\ +\d+\.\d+)<filler>(?<lonRMS>\d+\.\d+)<filler>和repacing with (忽略未引用的组,我将在其他实现中使用它):
$+{site}: $+{lat}, $+{lon}, $+{height}但当然,代价是通过GUI手动完成此操作。我想知道有没有办法通过管道pcregrep输出到sed进行文本替换来编写脚本?我知道可以使用pcregrep -M选项来匹配上面的多行正则表达式模式,并且在此之前我一直很成功,但是我还是坚持使用sed来解决这个问题。
发布于 2012-07-26 14:30:17
我将使用awk来处理您的文本文件:
awk '$1 ~ /^[0-9]+$/ { printf "%s: ", $2 } $1 == "HEIGHT" { height = $3 } $1 == "LATITUDE" { printf "%s %s %s, ", $2, $3, $4 } $1 == "LONGITUDE" { printf "%s %s %s, %s\n", $5, $6, $7, height }' file.txt为提高可读性,分成多行:
$1 ~ /^[0-9]+$/ {
printf "%s: ", $2
}
$1 == "HEIGHT" {
height = $3
}
$1 == "LATITUDE" {
printf "%s %s %s, ", $2, $3, $4
}
$1 == "LONGITUDE" {
printf "%s %s %s, %s\n", $5, $6, $7, height
}结果:
DAEJ: 36 23 57.946407, 127 22 28.132160, 116.6419编辑:
将以下代码放入名为script.awk的文件中
$3 == "X" {
printf "%s: ", $2
}
$1 == "HEIGHT" {
height = $3
}
$1 == "LATITUDE" {
if ($2 == "-" && $6 == "-") { printf "-%s %s %s, ", $7, $8, $9 }
else if ($2 == "-") { printf "%s %s %s, ", $6, $7, $8 }
else if ($5 == "-") { printf "-%s %s %s, ", $6, $7, $8 }
else { printf "%s %s %s, ", $5, $6, $7 }
}
$1 == "LONGITUDE" {
if ($2 == "-" && $6 == "-") { printf "-%s %s %s, %s\n", $7, $8, $9, height }
else if ($2 == "-") { printf "%s %s %s, %s\n", $6, $7, $8, height }
else if ($5 == "-") { printf "-%s %s %s, %s\n", $6, $7, $8, height }
else { printf "%s %s %s, %s\n", $5, $6, $7, height }
}像这样运行:
awk -f script.awk file.txt发布于 2012-07-26 16:23:26
这可能适用于您(GNU sed):
sed '/^DAEJ/,/^\s*LONGITUDE/!d;/HEIGHT/{s/^\s*\S*\s*\S*\s*\(\S*\).*/\1/;h};/LATITUDE/{s/^\s*\(\S*\s*\)\{4\}\(\(\S*\s*\)\{2\}\S*\).*/\2/;H};/LONGITUDE/!d;s/^\s*\(\S*\s*\)\{4\}\(\(\S*\s*\)\{2\}\S*\).*/ \2/;H;g;y/\n/,/;s/\([^,]*\),\(.*\)/DAEJ: \2, \1/' file1 file2 filenhttps://stackoverflow.com/questions/11663185
复制相似问题