剪切特定列并在 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
$
假设我在一个文本文件中有 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
$