awk:更改字段分隔符,保持第一列不变

Dan*_*Cee 4 regex awk field

我有一个in.csv只有一列的文件以这种方式:

Sample
a_b_c
d_e_f
g_h_i
Run Code Online (Sandbox Code Playgroud)

我想将字段分隔符从 to 更改_,并打印单独的字段,但将输入列保持在输出文件的第一列中。我想awk原则上使用。

这是我到目前为止:

awk 'BEGIN {FS="_";OFS=","} {$1=$1}1' in.csv > out.csv
Run Code Online (Sandbox Code Playgroud)

这给了我这个

Sample
a,b,c
d,e,f
g,h,i
Run Code Online (Sandbox Code Playgroud)

我怎样才能像这样输出它,保留原始列(重命名ID)?

ID,group1,group2,group3
a_b_c,a,b,c
d_e_f,d,e,f
g_h_i,g,h,i
Run Code Online (Sandbox Code Playgroud)

请注意,输入的字段数是可变的,输入Sample行可能是其他名称,或者为空,甚至不存在,但我仍然希望这样的输出......

编辑

检查所有答案后,我必须在这里澄清上面的输入文件只是一个例子......我的真实文件通常有超过3个字段_(但我事先不知道有多少)和无数行分隔,但是我将尝试确保给定文件中的所有行在要“拆分”的字段数上保持一致。

当我的文件每行要拆分的字段多于或少于 3 个时,下面的答案似乎不起作用,如果可能的话,我需要一个更通用的单行。

目前,为了简单起见,我宁愿不对标题行做任何事情并保持原样。

这意味着对于另一个示例:

Some_header
a_b_c_1
d_e_f_2
g_h_i_3
Run Code Online (Sandbox Code Playgroud)

我想获得这个:

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
Run Code Online (Sandbox Code Playgroud)

最佳情况下,单行应该处理存在字段不一致的行的情况,因此从这样的文件中:

Some_header
a_b_c
d_e_f_2
g_h_i_3_4
Run Code Online (Sandbox Code Playgroud)

我想获得这个:

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
Run Code Online (Sandbox Code Playgroud)

有没有办法用_in 变量记录行,然后将变量拆分为_,然后打印变量及其所有组件,并由 分隔,?对不起,我认为这会更容易……也许单线会更容易Perl?对不起,对单线不够精通……再次感谢!

Rav*_*h13 6

您能否尝试仅对显示的样本进行以下、编写和测试。这应该适用于在https://ideone.com/fWgggq 中测试过的任意数量的字段

awk '
BEGIN{
  FS="_"
  OFS=","
  print "ID,group1,group2,group3"
}
FNR>1{
  val=$0
  $1=$1
  print val,$0
}'  Input_file
Run Code Online (Sandbox Code Playgroud)

说明:为以上添加详细说明。

awk '                                   ##Starting awk program from here.
BEGIN{                                  ##Starting BEGIN section of program from here.
  FS="_"                                ##Setting field separator as _ here,
  OFS=","                               ##Setting OFS as comma here.
  print "ID,group1,group2,group3"       ##Printing header as per OP requirement here.
}
FNR>1{                                  ##Checking condition if this is greater than 1st line then do following.
  val=$0                                ##Store current line into var val here.
  $1=$1                                 ##reassign first field to itself so that new OFS which is , is implemented to whole line.
  print val,$0                          ##Printing current new line here.
}'  Input_file                          ##Mentioning Input_file name here.
Run Code Online (Sandbox Code Playgroud)