在特定字段的字符串中附加字符

时间:2014-12-05 07:22:16

标签: bash shell awk sed

我熟悉sed awk和grep的基础知识。我有一个包含11个字段的文件。在第10和第11领域,我有纬度和经度坐标。它们的结构如下:-5555555。我想要做的是在两个字段中的两位数之后插入句点。所以期望的结果将是-55.5555。使用awk / sed或任何其他工具,我最好的方法是什么?

档案样本:

01 00460 Adamsville city     AL    4161   1554 0000007948 0000000000 +33595542 -086957993

4 个答案:

答案 0 :(得分:3)

使用awk你可以这样做:

awk '{for (i=NF-1; i<=NF; i++) sub(/^[-+]?[0-9][0-9]/, "&.", $i)} 1' file
01 00460 Adamsville city AL 4161 1554 0000007948 0000000000 +33.595542 -08.6957993

此awk命令在最后2个字段的开头搜索正则表达式模式[-+]?[0-9][0-9],并将其替换为匹配的文本+点

Code Demo

答案 1 :(得分:2)

通过sed,

sed 's/^\( *\([^ ]\+ \+\)\{4\}-*[0-9]\{2\}\)\([^ ]* \+-*[0-9]\{2\}\)/\1.\3./' file

示例:

$ cat file
foo v v v -5555555 55555
$ sed 's/^\( *\([^ ]\+ \+\)\{4\}-*[0-9]\{2\}\)\([^ ]* \+-*[0-9]\{2\}\)/\1.\3./' file
foo v v v -55.55555 55.555

答案 2 :(得分:0)

我的解决方案在awk中没有使用正则表达式

echo " 1 2 3 4 -5555555"|awk '{print substr($5, "1","3") "." substr($5,"4") }'
-55.55555

说明:打印前3个字符(包括-个符号),一个句点,然后是剩余的字符。

答案 3 :(得分:0)

使用普通的旧bash,使用子串模式匹配是最简单的方法:

 a="5555555 55555"; b=-${a/555/55.}; b=${b/\ 55555/ 55.55.};  echo "b: $b"
  -55.5555 55.55

我对所需的确切结果感到有些困惑。如果需要调整,请告诉我。