使用AWK垂直拆分列

时间:2017-04-10 22:26:52

标签: awk

如果我有+2,我希望这是+ 2作为单独的列。我正在为一个大型列做这个,所以我不能手动完成。

编辑#1

cat maser_neg_test.txt | awk '{print NR, $0}' | awk '{print $1, $2, ((15 * $3) 
+ ((1/4) * $4) + ((1/240) * $5)), (($6)+ ($7/60) + ($8/3600) ,$9}' | awk 
'{printf "%s %-15s %-10s %-10s %-6s\n", $1, $2, $3, $4 , $5}' > 
maser_neg_test2.txt

是我的代码,它会转换

RXSJ00001+0523 00 00 11.78 +05 23 17.4 11992 2016-02-12 51.3 3 10.9 10631 13365
KUG2358+330 00 00 58.10 +33 20 38.0 12921 2012-11-17 36.5 8 4.0 11461 14395
0001233+4733537 00 01 23.30 +47 33 53.7 5237 2010-11-02 39.5 10 3.6 3848 6639 3.5 6358 9196
NGC-7805 00 01 26.76 +31 26 01.4 4850 2006-01-05 43.8 5 6.0 3464 6248 5.6 5968 8799

1 RXSJ00001+0523 0.04908 5.38817 11992 
2 KUG2358+330 0.24208 33.3439 12921 
3 0001233+4733537 0.34708 47.5649 5237 
4 NGC-7805 0.36150 31.4337 4850"

但我的研究顾问指出,在我的转换中

dec:
1*(hr) = degree_1
(1/60) * (min) = degree_2
(1/3600) * (sec) = degree_3

degree_1 + degree_2 + degree_3 = dec (degrees)

这是数据+05 23 17.4作为hr min sec,只是在符号为负时添加它们并不能将它们组合在一起。所以我在做计算之前尝试拔出标志然后重新应用

编辑2

是一些负面案例的例子;对不起,这是我的第一篇文章,我一开始并不确定如何格式化它。

NGC-23   00 09 53.42  +25 55 25.5   4565  2005-12-18   44.2  30   2.5   3182   5961   2.3   5681   8506
      UM207   00 10 06.63  -00 26 09.4   9648  2010-01-10   25.2  10   2.1   8218  11091   2.1  10802  13723
    MARK937   00 10 09.99  -04 42 38.0   8846  2016-02-04   42.5  10   4.4   7512  10192
     Mrk937   00 10 10.01  -04 42 37.9   8851  2003-11-01   60.4  24   4.1   7428  10286
     NGC-26   00 10 25.86  +25 49 54.6   4589  2005-12-14   41.2   5   5.7   3205   5985   5.1   5705   8531

3 个答案:

答案 0 :(得分:2)

我认为你使用多层awk(以及不必要的cat)并且考虑如何“垂直拆分列”而不是仅仅解决问题似乎过于复杂化了很多事情如果是负号,你应该减去而不是添加分钟和秒。

因此,使用中间变量并检查符号($5 ~ /^-/):

awk '{ deg = $6/60 + $7/3600; deg = ($5 ~ /^-/) ? $5 - deg : $5 + deg;
       printf "%s %-15s %-10s %-10s %-6s\n",
              NR, $1, ((15 * $2) + (1/4 * $3) + (1/240 * $4)), deg, $8
     }' maser_neg_test.txt

(编辑:正如OP指出的那样,当该字段为$5 < 0时,原始测试-0将失败。)

答案 1 :(得分:0)

尝试这样的事情:

echo '+2' | awk -v FS="" '{print $1" "$2}'
Result:
+ 2

如果您的文本文件(test.txt)包含

等信息
+2
-3
+4
+5

你需要输出如下:

+ 2
- 3
+ 4
+ 5

试试这个:

awk -v FS="" '{print $1" "$2}' test.txt

正如两位评论者所提到的那样,添加一些示例数据和您想要的输出会更好。上面的答案只是您可以格式化数据的众多方法之一。

修改

在您的特定示例中,您可以像这样使用sed而不是cat&#39}

sed 's_+__g' test.txt | awk '{print NR, $0}' | awk '{print $1, $2, 15*$3 + $4/4 + $5/240, $6 + $7/60 + $8/3600, $9}'

sed会将您的文件中的+替换为空,然后将输出发送到awk。如果您还有-,也可以通过创造性地使用sed或双重sed来删除它们,如下所示:

sed 's_+__g' test.txt | sed 's_-__g' | awk '{print NR, $0}' | awk '{print $1, $2, 15*$3 + $4/4 + $5/240, $6 + $7/60 + $8/3600, $9}'

在上面的场景中,您最终可能会删除第一列中可能需要的+和 - (看起来像相同的代码)。

答案 2 :(得分:0)

您可以将带有符号的字段拆分为数组。您可以将第一个数组元素保留为符号,将第二个数组元素保存为值:

$ awk '{match($6,/([+-])(.*)/,m);print "m[1]=",m[1],"  m[2]=",m[2];print m[1] m[2]+$7/60+$8/3600}' <<<"1 RXSJ00001+0523 00 00 11.78 -05 23 17.4"
#Output
m[1]= -   m[2]= 05
-5.38817

因此,您可以使用m [2]而不是$ 6进行所有计算。 如果需要打印标志,只需在m [2]

之前打印m [1]

PS:通过省略打印中的昏迷并使用空格来强制连接(参见上面的示例)