替换第五列中的值

替换第五列中的值

我有多个文本

Name 1:10:34 date short_id 10 
Name 1:10:45 date short_id 10
Name 1:20:54 date short_id 20
Name 1:30:43 date short_id 30
Name 1:40:43 date short_id 40
Name 1:40:13 date short_id 40
Name 1:20:01 date short_id 20
Name 1:10:01 date short_id 10

我想替换第五列,但是当我使用 sed 's/\b10\b/user1/g'第二列时也会改变

输出应如下所示:

Name 1:10:34 date short_id user1
Name 1:10:45 date short_id user1
Name 1:20:54 date short_id user2
Name 1:30:43 date short_id user3
Name 1:40:43 date short_id user4
Name 1:40:13 date short_id user4
Name 1:20:01 date short_id user2
Name 1:10:01 date short_id user1

- - 更新 - -

如果没有user1,就会有一个名称,第二列只是时间,与名称无关

像这样的东西

Name 1:10:34 date short_id John
Name 1:10:45 date short_id John
Name 1:20:54 date short_id Robert
Name 1:30:43 date short_id Jennifer
Name 1:40:43 date short_id Mary
Name 1:40:13 date short_id Mary
Name 1:20:01 date short_id Robert
Name 1:10:01 date short_id John

答案1

好吧,不幸的是,sed不知道那10John。因此,如果您不想为每个用户编写另一个替换,您可能需要使用users.txt带有转换表的第二个文件,如下所示:

10 John
20 Robert
30 Jennifer
40 Mary

然后将这两个文件输入到此sed命令中:

sed '/^[0-9]* [[:alnum:]]*$/{H;d;};G;s/ \([0-9]*\)\n.*\n\1 \([[:alnum:]]*\)/ \2/;P;d' users.txt yourfile.log

首先读取转换表并将其存储到保持空间中。对于其他文件,将附加包含翻译的保留空间,并在可能的情况下执行替换。然后P仅将行打印到第一个换行符,因此如果用户 ID 未知,则不会打印混乱。

如果您有兴趣了解更详细的解释,请参阅如何在一个文件中定义的内容替换另一文件或者随时询问。

答案2

还有两个 awk 解决方案。

$ awk '{$5="user"substr($5,1,1)}1' file
Name 1:10:34 date short_id user1
Name 1:10:45 date short_id user1
Name 1:20:54 date short_id user2
Name 1:30:43 date short_id user3
Name 1:40:43 date short_id user4
Name 1:40:13 date short_id user4
Name 1:20:01 date short_id user2
Name 1:10:01 date short_id user1
$
$ awk '{$5="user"$5/10}1' x1
Name 1:10:34 date short_id user1
Name 1:10:45 date short_id user1
Name 1:20:54 date short_id user2
Name 1:30:43 date short_id user3
Name 1:40:43 date short_id user4
Name 1:40:13 date short_id user4
Name 1:20:01 date short_id user2
Name 1:10:01 date short_id user1
$

答案3

awk 'gsub(/0/, "", $5) { print $1, $2, $3, $4, "user" $5 }' INPUT

gsub 删除第五列中的数字“0”。然后 awk 打印第 1-4 列,并将单词“user”与第 5 列组合(“user”和 $5 之间没有“,”)。

答案4

使用sed

sed 's/\(.*\) \(.\).*/\1 user\2/' input_file
Name 1:10:34 date short_id user1
Name 1:10:45 date short_id user1
Name 1:20:54 date short_id user2
Name 1:30:43 date short_id user3
Name 1:40:43 date short_id user4
Name 1:40:13 date short_id user4
Name 1:20:01 date short_id user2
Name 1:10:01 date short_id user1

相关内容