awk将空格后的信息复制到新列

awk将空格后的信息复制到新列,awk,Awk,我有一个小时值的数据,只想将日期列中的小时值复制到新列中。 鉴于: 我希望结果是: 01/02/2021 07:00,54596894,0,SIEA,07 01/02/2021 09:00,55038801,0,SIEA,09 01/02/2021 06:00,55038845,0,SIEA,06 01/02/2021 02:00,78434342,0.004,SIEA,02 01/02/2021 15:00,78434429,0,SIEA,15 01/02/2021 17:00,7843483

我有一个小时值的数据,只想将日期列中的小时值复制到新列中。 鉴于:

我希望结果是:

01/02/2021 07:00,54596894,0,SIEA,07
01/02/2021 09:00,55038801,0,SIEA,09
01/02/2021 06:00,55038845,0,SIEA,06
01/02/2021 02:00,78434342,0.004,SIEA,02
01/02/2021 15:00,78434429,0,SIEA,15
01/02/2021 17:00,78434838,0.005,SIEA,17
01/02/2021 05:00,78508079,2.715,SIEA,05
01/02/2021 19:00,79083881,0,SIEA,19
01/02/2021 12:00,82928135,0,SIEA,12
01/02/2021 01:00,83889954,0,SIEA,01
我一直在与awk合作,但只能让它给我专栏的第一部分。我需要得到空格后面的内容,空格后面只有两个字符。

awk'{n=split($1,a,“”);print$0,“[n]}”

产生

01/02/2021 07:00,54596894,0,SIEA,01/02/2021
01/02/2021 09:00,55038801,0,SIEA,01/02/2021
...
如果我得到空格后的所有字符(尽管我更喜欢只得到两个直接字符),我也可以,但我似乎不知道如何让它选择拆分的另一边

$ awk -F, '{split($1,a,"[ :]"); print $0 FS a[2]}' file

01/02/2021 07:00,54596894,0,SIEA,07
01/02/2021 09:00,55038801,0,SIEA,09
01/02/2021 06:00,55038845,0,SIEA,06
01/02/2021 02:00,78434342,0.004,SIEA,02
01/02/2021 15:00,78434429,0,SIEA,15
01/02/2021 17:00,78434838,0.005,SIEA,17
01/02/2021 05:00,78508079,2.715,SIEA,05
01/02/2021 19:00,79083881,0,SIEA,19
01/02/2021 12:00,82928135,0,SIEA,12
01/02/2021 01:00,83889954,0,SIEA,01

基于两个分隔符拆分,中间值为小时数。

无需
拆分。将字段分隔符设置为
(空格),将输出字段分隔符设置为
。然后打印整个记录和第二个字段

awk -F '[: ]' -v OFS=, '{print $0,$2}'

你能试试下面的吗。使用GNU
awk
中显示的样本编写和测试

awk '{print $0","substr($2,1,2)}' Input_file
Sed备选方案:

sed -E 's/(^.*[[:space:]])([[:digit:]]{2})(:.*$)/\1\2\3,\2/' file

使用-r-E启用正则表达式解释,将行拆分为括号之间指定的3个部分,然后打印第一、第二和第三部分,然后再打印逗号和第三部分。

所有
awk
解决方案都很好。下面是一个简单的
sed
,它也可以完成这项工作:

sed-E的/*([0-9]{2}):.*/&、\1/'文件
2021年2月1日07:0054596894,0,SIEA,07
2021年2月1日09:0055038801,0,SIEA,09
2021年2月1日06:0055038845,0,SIEA,06
2021年2月1日02:0078434342,0.004,SIEA,02
2021年2月1日15:0078434429,0,SIEA,15
2021年2月1日17:0078434838,0.005,SIEA,17
2021年2月1日05:0078508079,2.715,SIEA,05
2021年2月1日19:0079083881,0,SIEA,19
2021年2月1日12:0082928135,0,SIEA,12
2021年2月1日01:0083889954,0,SIEA,01
这里是另一个(更昂贵的)解决方案


$paste-d,我曾考虑使用sed文件,但我倾向于发现awk更直观(无论如何对我来说)。感谢函数替换名提出更多问题,但就我个人所知,您能澄清一下“[:]”吗?我知道这是字段分隔符名称,因为-F,但括号和分号是使用空格作为分隔符的必要组件吗?方括号表示字符集,因此,字段分隔符是空格或冒号。字符集中也有特殊字符,例如
-
可以表示范围。正则表达式的实用知识将大有帮助。对代码的解释将是:只需打印当前行,然后打印一个逗号以及包含2个字符(第一个和第二个字符)的第二个字段的子字符串。
sed -E 's/(^.*[[:space:]])([[:digit:]]{2})(:.*$)/\1\2\3,\2/' file
$ paste -d, file <(cut -d: -f1 file | cut -d' ' -f2)