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

Cut specific columns and collapse with delimiter in Unix

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

A1  B1  C1  D1  E1  F1
1   G   PP  GG  HH  GG
z   T   CC  GG  FF  JJ

我想提取第一列、第二列和第四列,因为 A1_B1_D1 折叠在一起,第三列用制表符分隔。

所以结果是:

A1_B1_D1    C1  
1_G_GG      PP
z_T_GG      CC

我试过了

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

能否请您尝试以下。

awk '
BEGIN{
  OFS="\t"
}
{
  print "_""_",
}
' Input_file

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

awk '{
    printf (length("_""_") >= 8) ? "%s_%s_%s\t%s\n" : "%s_%s_%s\t\t%s\n",
            ,,,
}' file

示例输出

A1_B1_D1        C1
1_G_GG          PP
z_T_GG          CC

我试过 RavinderSingh13 代码,它的输出与我的相同,但我不太清楚其中的区别,无论如何,它是:

awk -F ' ' '{print "_""_""\t"}' /path/to/file

这可能对你有用 (GNU sed):

sed 's/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+.*/__\t/' -E file

使用模式匹配和反向引用。

\S+ 表示一个或多个非白色 space 字符。

\s+表示一个或多个白色space字符。

\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="_" '{ ="\t"; print ,,  } ' cols_345.txt | column -t
A1_B1_D1  C1
1_G_GG    PP
z_T_GG    CC
$