使用AWK垂直拆分列

使用AWK垂直拆分列,awk,Awk,如果我有+2,我希望这是+2作为单独的列。我这样做是为了一个大的列,所以我不能手动操作 编辑#1 是我的代码,它转换 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

如果我有+2,我希望这是+2作为单独的列。我这样做是为了一个大的列,所以我不能手动操作

编辑#1

是我的代码,它转换

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
进入

但我的研究顾问指出,在我的

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

degree_1 + degree_2 + degree_3 = dec (degrees)
这是数据+052317.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

试着这样做:

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
,如下所示:

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

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

尝试以下操作:

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
,如下所示:

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

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

我认为您使用多层
awk
(以及不必要的
cat
),并考虑如何“垂直拆分列”,而不仅仅是解决问题,这会使事情变得过于复杂,对于负号,你应该减去,而不是加上,分和秒

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


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

我认为使用多层
awk
(以及不必要的
cat
),并考虑如何“垂直拆分列”,而不仅仅是解决问题,这会使事情变得过于复杂,对于负号,你应该减去,而不是加上,分和秒

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


(编辑:正如OP所指出的,当该字段为
-0
时,原始测试
$5<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

$awk'{match($6,/([+-])(.*)/,m;打印“m[1]=”,m[1],“m[2]=”,m[2];打印m[1]m[2]+$7/60+$8/3600}您可以将带有符号的字段拆分为一个数组。可以将第一个数组元素保留为符号,将第二个数组元素保留为值:

$ 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


$awk'{match($6,/([+-])(.*)/,m);打印“m[1]=”,m[1],“m[2]=”,m[2];打印m[1]m[2]+$7/60+$8/3600}请添加示例输入和所需输入以及您尝试过的内容。至于缺少示例,尤其是您没有显示任何负号,我猜这就是问题所在…请添加示例输入和所需输入以及您尝试过的内容。至于缺少示例,尤其是您没有显示一个负号,我猜这就是问题所在…当我们有负号时,我们需要减法?哦,天哪,我的回答完全错了……这是可行的,但当第5列为0,但为负0时,它不相减,因为它为0,所以我认为分离会更好idea@ripchint很好,我相应地编辑了答案!(同时,这些仍然是你应该在问题中提到的东西,并提供示例输入。)是的,很抱歉我一直试图编辑我的帖子,以跟上我忘记的内容,这是一个错误。你能解释一下“deg=($5~/-)”是怎么说的吗?我同时在学习/做一个项目,所以我对这个比较陌生,当我们有负号时,我们需要减法吗?哦,天哪,我的回答完全错了……这是可行的,但当第5列为0,但为负0时,它不相减,因为它为0,所以我认为分离会更好idea@ripchint很好,我相应地编辑了答案!(同时,这些仍然是你应该在问题中提到的东西,并提供示例输入。)是的,很抱歉我一直试图编辑我的帖子,以跟上我忘记的内容,这是一个错误。你能解释一下“deg=($5~/-)”是怎么说的吗?我同时在学习/做一个项目,所以我对这个问题比较陌生。考虑到这个问题的措辞,我认为你的答案是完全合理的。然而,我不认为
match
的第三个参数是标准的,也许你假设了gawk?@Arkku-Yest,这是正确的。这个解决方案适用于GNU awk。我认为你的答案完全是合理的