在Unix中剪切特定列并使用分隔符折叠

在Unix中剪切特定列并使用分隔符折叠,unix,awk,sed,cut,Unix,Awk,Sed,Cut,假设我在一个文本文件中有6个不同的列(如下所示) 我想提取第一列、第二列和第四列,因为A1_B1_D1一起折叠,第三列由tab分隔 因此,结果将是: A1_B1_D1 C1 1_G_GG PP z_T_GG CC 我试过了 cut-f1,2,4-d$'\t'3,但这不是我想要的 你能试试下面的吗 awk ' BEGIN{ OFS="\t" } { print $1"_"$2"_"$4,$3 } ' Input_file 你能试试下面的吗 awk ' BE

假设我在一个文本文件中有6个不同的列(如下所示)

我想提取第一列、第二列和第四列,因为A1_B1_D1一起折叠,第三列由tab分隔

因此,结果将是:

A1_B1_D1    C1  
1_G_GG      PP
z_T_GG      CC
我试过了


cut-f1,2,4-d$'\t'3
,但这不是我想要的

你能试试下面的吗

awk '
BEGIN{
  OFS="\t"
}
{
  print $1"_"$2"_"$4,$3
}
' Input_file

你能试试下面的吗

awk '
BEGIN{
  OFS="\t"
}
{
  print $1"_"$2"_"$4,$3
}
' Input_file

如果需要保持列对齐,可以检查字段1、2和4组合的长度,并根据需要添加一个或两个
tab
字符

awk '{
    printf (length($1"_"$2"_"$4) >= 8) ? "%s_%s_%s\t%s\n" : "%s_%s_%s\t\t%s\n",
            $1,$2,$4,$3
}' file
示例输出

A1_B1_D1        C1
1_G_GG          PP
z_T_GG          CC

如果需要保持列对齐,可以检查字段1、2和4组合的长度,并根据需要添加一个或两个
tab
字符

awk '{
    printf (length($1"_"$2"_"$4) >= 8) ? "%s_%s_%s\t%s\n" : "%s_%s_%s\t\t%s\n",
            $1,$2,$4,$3
}' file
示例输出

A1_B1_D1        C1
1_G_GG          PP
z_T_GG          CC

我尝试过RavinderSingh13代码,它的输出与我的相同,但我不太清楚两者的区别,总之,它是:


awk-F'{print$1”\u“$2”\u“$4”\t“$3}'/path/to/file

我尝试过RavinderSingh13代码,它的输出与我的相同,但我不太清楚区别,总之,它是:

awk-F'{print$1“\u“$2”\u“$4”\t“$3}'/path/to/file

这可能适合您(GNU-sed):

使用模式匹配和反向引用

\S+
表示一个或多个非空白字符

\s+
表示一个或多个空白字符

\t
表示一个选项卡。

这可能适用于您(GNU-sed):

使用模式匹配和反向引用

\S+
表示一个或多个非空白字符

\s+
表示一个或多个空白字符


\t
表示一个选项卡。

另一个awk并使用列-t进行格式化

$ cat cols_345.txt
A1  B1  C1  D1  E1  F1
1   G   PP  GG  HH  GG
z   T   CC  GG  FF  JJ
$ awk -v OFS="_" '{ $3="\t"$3; print $1,$2,$4 $3 } ' cols_345.txt | column -t
A1_B1_D1  C1
1_G_GG    PP
z_T_GG    CC
$

另一个awk,使用列-t进行格式化

$ cat cols_345.txt
A1  B1  C1  D1  E1  F1
1   G   PP  GG  HH  GG
z   T   CC  GG  FF  JJ
$ awk -v OFS="_" '{ $3="\t"$3; print $1,$2,$4 $3 } ' cols_345.txt | column -t
A1_B1_D1  C1
1_G_GG    PP
z_T_GG    CC
$

这是因为我将OFS值设置为制表符,而您正在打印时手动将制表符放在值之间。@Augusto:OFS:输出字段分隔符,默认为空格。这是因为我将OFS值设置为制表符,而您正在打印时手动将制表符放在值之间。@Augusto:OFS:输出字段分隔符,默认为空格。