【发布时间】:2020-11-24 09:07:13
【问题描述】:
我有一个in.csv 文件,其中只有一列:
Sample
a_b_c
d_e_f
g_h_i
我想将字段分隔符从 _ 更改为 , 并打印单独的字段,但将输入列保持在输出文件的第一列中。原则上我想用awk。
这是我目前所拥有的:
awk 'BEGIN {FS="_";OFS=","} {$1=$1}1' in.csv > out.csv
这给了我这个
Sample
a,b,c
d,e,f
g,h,i
我怎样才能像这样输出它,保留原始列(重命名ID)?
ID,group1,group2,group3
a_b_c,a,b,c
d_e_f,d,e,f
g_h_i,g,h,i
请注意,输入的字段数是可变的,输入 Sample 行可能是其他名称,或者为空,甚至不存在,但我仍然希望这样的输出......
编辑
在检查完所有答案后,我必须在这里澄清一下,上面的输入文件只是一个例子......我的真实文件通常有3个以上的字段,由_分隔(但我不知道有多少事先) 和无数行,但是我会尽量确保给定文件中的所有行在要“拆分”的字段数上保持一致。
当我的文件每行拆分的字段多于或少于 3 个时,以下答案似乎不起作用,如果可能的话,我需要一个更通用的单行。
目前,为了简单起见,我宁愿不对标题行做任何事情并保持原样。
这意味着对于另一个示例:
Some_header
a_b_c_1
d_e_f_2
g_h_i_3
我想得到这个:
Some_header
a_b_c_1,a,b,c,1
d_e_f_2,d,e,f,2
g_h_i_3,g,h,i,3
最佳情况下,单行应该处理存在字段不一致的行的情况,因此从这样的文件中:
Some_header
a_b_c
d_e_f_2
g_h_i_3_4
我想得到这个:
Some_header
a_b_c,a,b,c
d_e_f_2,d,e,f,2
g_h_i_3_4,g,h,i,3,4
难道没有办法将_的行记录在一个变量中,然后用_分割变量,然后打印出用,分隔的变量及其所有组件?抱歉,我认为这会更容易......也许使用Perl 单线会更容易?抱歉,对单行词不太熟练...再次感谢!
【问题讨论】:
-
preserving the original column (renamed ID)保留还是重命名? -
保留原样,使用不同的标头(但仍可以是相同的标头)
-
签出
split()函数。split($0,"_",array);print $0","a[0],a[1],a[2] -
请检查我的编辑