如果我有+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
答案 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:通过省略打印中的昏迷并使用空格来强制连接(参见上面的示例)