Awk 如何在unix中使用sed删除整列数据?

Awk 如何在unix中使用sed删除整列数据?,awk,sed,grep,Awk,Sed,Grep,我需要一些使用sed命令从文件中删除所有驱动程序名称的帮助。我尝试了多个不同的命令,但无法使其正常运行 输入: Rank Country Driver Races Wins 1 [United_Kingdom] Lewis_Hamilton 264 94 2 [Germany] Sebastian_Vettel 254 53 3 [Spain] Fernando_Alonso 311 32 4 [Finland] Kimi_Raikkonen

我需要一些使用sed命令从文件中删除所有驱动程序名称的帮助。我尝试了多个不同的命令,但无法使其正常运行

输入:

Rank Country         Driver       Races Wins
1 [United_Kingdom] Lewis_Hamilton 264 94
2 [Germany] Sebastian_Vettel      254 53
3 [Spain] Fernando_Alonso         311 32
4 [Finland] Kimi_Raikkonen        326 21
5 [Germany] Nico_Rosberg          200 23
Rank Country         Driver       Races Wins
1 [United_Kingdom]                 264 94
2 [Germany]                        254 53
3 [Spain]                          311 32
4 [Finland]                        326 21
5 [Germany]                        200 23
我尝试过使用
catf1.txt | sed-r的/\s+//3'
,但它没有保留我想要的格式

我想要它做什么

输入:

Rank Country         Driver       Races Wins
1 [United_Kingdom] Lewis_Hamilton 264 94
2 [Germany] Sebastian_Vettel      254 53
3 [Spain] Fernando_Alonso         311 32
4 [Finland] Kimi_Raikkonen        326 21
5 [Germany] Nico_Rosberg          200 23
Rank Country         Driver       Races Wins
1 [United_Kingdom]                 264 94
2 [Germany]                        254 53
3 [Spain]                          311 32
4 [Finland]                        326 21
5 [Germany]                        200 23

简单的方法是用等于字段长度的空格替换
$3
,例如

awk 'FNR > 1{s=sprintf("%*s", length($3) + 1, " "); sub($3,s)}1' drivers
条件
FNR>1
只是跳过文件中的第一行以保留所有标题<代码>+1已添加到第三个字段的长度,以匹配您的精确输出格式

示例使用/输出

$ awk 'FNR > 1{s=sprintf("%*s", length($3) + 1, " "); sub($3,s)}1' drivers
Rank Country         Driver       Races Wins
1 [United_Kingdom]                 264 94
2 [Germany]                        254 53
3 [Spain]                          311 32
4 [Finland]                        326 21
5 [Germany]                        200 23
$ awk 'NF == 5 && $1 ~ /^[0-9]/ {s=sprintf("%*s", length($3)+1, " "); sub($3,s)}1' drivers
Input:

Rank Country         Driver       Races Wins
1 [United_Kingdom]                 264 94
2 [Germany]                        254 53
3 [Spain]                          311 32
4 [Finland]                        326 21
5 [Germany]                        200 23
注意:如果您的输入文件实际上包含
“input:”
,那么您将使用:

awk 'NF == 5 && $1 ~ /^[0-9]/ {s=sprintf("%*s", length($3)+1, " "); sub($3,s)}1' drivers
这里的条件
'NF==5&&$1~/^[0-9]/
仅将替换应用于具有以数字开头的五个字段的记录(行)

输出

$ awk 'FNR > 1{s=sprintf("%*s", length($3) + 1, " "); sub($3,s)}1' drivers
Rank Country         Driver       Races Wins
1 [United_Kingdom]                 264 94
2 [Germany]                        254 53
3 [Spain]                          311 32
4 [Finland]                        326 21
5 [Germany]                        200 23
$ awk 'NF == 5 && $1 ~ /^[0-9]/ {s=sprintf("%*s", length($3)+1, " "); sub($3,s)}1' drivers
Input:

Rank Country         Driver       Races Wins
1 [United_Kingdom]                 264 94
2 [Germany]                        254 53
3 [Spain]                          311 32
4 [Finland]                        326 21
5 [Germany]                        200 23

我不清楚这是否真的是文件的一部分。

请尝试以下内容,这可以解决名称字段中可能有空格的情况(考虑到名称中没有数字)


我会用
AWK
下面的方法来做,让
file.txt
内容如下:

Rank Country         Driver       Races Wins
1 [United_Kingdom] Lewis_Hamilton 264 94
2 [Germany] Sebastian_Vettel      254 53
3 [Spain] Fernando_Alonso         311 32
4 [Finland] Kimi_Raikkonen        326 21
5 [Germany] Nico_Rosberg          200 23
然后

输出

Rank Country         Driver       Races Wins
1 [United_Kingdom]                264 94
2 [Germany]                       254 53
3 [Spain]                         311 32
4 [Finland]                       326 21
5 [Germany]                       200 23
说明:我用
]
之后的空格全局替换字母和
,为此,我将字段分隔符设置为
]
,并在第二列使用
gsub
,即
]
之后的所有内容。我还将输出字段分隔符设置为
]
以保留它。

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

在第一行之后,用空格替换第三个字段

备选方案:

sed -E '1b;s/\S+/\n&\n/3;h;s/[^\n]/ /g;H;g;s/\n.*\n(.*)\n.*\n(.*)\n.*/\2\1/' file

编辑您的Q以显示包含您认为应该有效的命令。如果我们不知道您“在哪里”(关于
sed
理解),我们无法帮助您修正理解。祝你好运。(OT:)也喜欢这种方法,现在你得到了
:)