2017-04-10 113 views
0

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

编辑#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 
00.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 00.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

请添加示例输入和所需输入以及您尝试的内容。 – dawg

+1

至于缺乏的例子,尤其是你没有显示一个负号的情况下,我猜是问题... – Arkku

回答

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失败。)

+0

当我们有一个负号时,我们需要减去?哦,上帝,我在答案中完全错了...... –

+0

这可以工作,但是当第5列为0但是为负0时,它不会减去,因为它是0因此这就是为什么我认为分离会是更好的想法 – ripchint

+0

@ripchint好点,我编辑了相应的答案! (同时这些仍然是你应该提到的问题,并提供了示例输入。) – Arkku

0

尝试这样:

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

如果你有信息,如

+2 
-3 
+4 
+5 

一个文本文件(test.txt的),你需要输出像这样:

+ 2 
- 3 
+ 4 
+ 5 

试试这个:

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

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

编辑

在你的具体的例子,你可以只使用sed代替cat“荷兰国际集团,像这样的文件:

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}' 

在上面的场景中,你可能最终消除+和 - 这是大概在想第一列(看起来像相同的代码)。

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 

因此,您可以用米的所有计算[2],而不是$ 6 如果您需要打印的标志,你只需要打印米[1]之前M [2]

PS:通过ommiting打印时的昏迷和使用空间,你强制级联(见上面我的例子)

+0

我想你的回答是完全合理的,因为这个问题的措辞如何。然而,我不认为“match”的第三个参数是标准的,也许你认为gawk? – Arkku

+0

@Arkku Yest,这是正确的。这个解决方案适用于GNU awk。 –