2017-04-10 11 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 

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" 

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 

を変換し、私のコードですが、私の研究顧問は

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

欠けている例としては、特に私は、負の符号の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で指摘したように、そのフィールドが-0たとき、元のテスト$5 < 0は失敗します)

+0

我々は、負の符号があるときを引き算する必要がありますか?ああ、私の答えで完全に間違っている... –

+0

これは動作しますが、カラム5が0で負の値0のときは0なので減算しないので、分離がより良いアイデアになると思います。 – ripchint

+0

@ripchint良い点、私はそれに応じて答えを編集しました! (一方で、これはまだあなたが質問で言及していたはずのものです) – Arkku

0

このような何か試してください:あなたは、このような

+2 
-3 
+4 
+5 

などの情報をテキストファイル(test.txtという)があり、そのような出力が必要な場合

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

を:

+ 2 
- 3 
+ 4 
+ 5 

試用:

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

2人のコメント作成者が言及しているように、いくつかのサンプルデータと必要な出力を追加するとよいでしょう。上記の答えは、データを書式設定できる多くの方法の1つに過ぎません。

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は何もあなたのファイルに+を交換してからお送りします:

EDITあなたの特定の例では

、あなただけそうのようなファイルをINGの」の代わりcatsedを使用することができます出力はawkになります。あなたも-を持っている場合、あなたはおそらくそのようINGの」創造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]メートルの前に記号を印刷する必要がある、あなただけメートルを印刷する必要がある場合は、[2]

PS:プリントコマ収差をommitingとスペースを使用することにより、あなたが連結を強制する(上記の私の例を参照)

+0

あなたの答えは、その質問がどのように語られたかを考えれば完全に合理的だと思います。しかし、私は 'match 'の第3引数が標準ではないと思います、おそらくあなたはgawkを仮定していますか? – Arkku

+0

@Arkku Yest、それは正しいです。このソリューションはGNU awkで動作します。 –

関連する問題