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