Bash脚本更新最后一个字符

时间:2019-02-26 14:18:38

标签: bash shell unix awk sed

我有一个文本文件,结尾是两种字符串,例如100m,200m或6、7等。 当最后一个字符串不包含“ m”字符时,bash脚本应将其乘以1024并附加m。以m结尾的行应该保持不变。

我已经尝试使用awk的多个if,else子句,但是找不到正确的结果。请帮忙。出于安全原因,我无法共享文件,但在下面提供示例

输入文件

fwhjgqdgqdg 100m
gdjegdegge 200m
fdfqwkdgqwdgqwdgh 300m
fhwfgwgdgw1 8998m
tdfdyfdgeu 6
feuegdhe 2
ffhevjevf 0
jhedhevhjkd 0

输出应为

fwhjgqdgqdg 100m
gdjegdegge 200m
fdfqwkdgqwdgqwdgh 300m
fhwfgwgdgw1 8998m
tdfdyfdgeu 6124m
feuegdhe 2048m
ffhevjevf 0m
jhedhevhjkd 0m

3 个答案:

答案 0 :(得分:0)

尝试以下-

$ awk '$NF !~ /m/{$NF = ($NF * 1024) "m"} 1' file
fwhjgqdgqdg 100m
gdjegdegge 200m
fdfqwkdgqwdgqwdgh 300m
fhwfgwgdgw1 8998m
tdfdyfdgeu 6144m
feuegdhe 2048m
ffhevjevf 0m
jhedhevhjkd 0m

$NF是记录(行)上最后一个字段的值。如果它不包含m,则乘以1024并连接一个m。最后的1是一个真实条件,它将导致awk调用其默认的打印记录操作。

答案 1 :(得分:0)

请您尝试以下。

awk -v var="1024" -v field="2" -v char="m" '$field !~ char{$field= ($field * 1024) char} 1' Input_file

说明: 我创建了名为var的变量:该变量将具有您要相乘的值,field您可以提及字段号这里要检查的字段是char,要检查的字符是否在行中。

您也可以根据需要更改这些值。现在,在awk命令中,我正在检查条件,如果某行的$field没有var值,然后执行以下操作,即将多字段的值与变量var值和变量{ {1}}。

最后指导char将为Input_file打印已编辑/未编辑的行。

答案 2 :(得分:0)

尝试Perl

perl -pe ' s/(\d+)$/1024*$1/ge and s/$/m/ ' 

使用您给定的输入

$ cat subit.txt
fwhjgqdgqdg 100m
gdjegdegge 200m
fdfqwkdgqwdgqwdgh 300m
fhwfgwgdgw1 8998m
tdfdyfdgeu 6
feuegdhe 2
ffhevjevf 0
jhedhevhjkd 0

$ perl -pe ' s/(\d+)$/1024*$1/ge and s/$/m/ ' subit.txt
fwhjgqdgqdg 100m
gdjegdegge 200m
fdfqwkdgqwdgqwdgh 300m
fhwfgwgdgw1 8998m
tdfdyfdgeu 6144m
feuegdhe 2048m
ffhevjevf 0m
jhedhevhjkd 0m

$