我有一个文本文件,结尾是两种字符串,例如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
答案 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
$