Bash 根据子字段值删除复合字段
我有一个文件包含“a*B”的复合字段,其中“a”和“B”是数值。我需要一个简单的解决方案(比如使用awk或sed的单行命令)来删除“B”高于特定值的字段。例如,在我的Bash 根据子字段值删除复合字段,bash,awk,sed,Bash,Awk,Sed,我有一个文件包含“a*B”的复合字段,其中“a”和“B”是数值。我需要一个简单的解决方案(比如使用awk或sed的单行命令)来删除“B”高于特定值的字段。例如,在我的 4*1 13*5 19*3 26*7 31*1 52*4 60*6 80*2 我想删除“B”等于或大于5的字段,这样输出将是 4*1 19*3 31*1 52*4 80*2 在awk中,您可以尝试以下方法: awk -F" " '{s=""; for(i=1; i <= NF; i++){
4*1 13*5 19*3 26*7 31*1 52*4 60*6 80*2
我想删除“B”等于或大于5的字段,这样输出将是
4*1 19*3 31*1 52*4 80*2
在awk中,您可以尝试以下方法:
awk -F" " '{s="";
for(i=1; i <= NF; i++){
split($i, a, "*");
if(a[2] < 5){s = s $i (i == NF ? "\n" : " ")}
}
print s;
}' inputFile
救命啊
$ echo "4*1 13*5 19*3 26*7 31*1 52*4 60*6 80*2"
| awk '{for(i=1;i<=NF;i++)
if($i~/[0-9]+\*[1-4]\y/)
printf "%s ", $i;
print ""}'
4*1 19*3 31*1 52*4 80*2
编辑:添加单词边界。如何:
awk -F'*' '$2<5' RS=' ' ORS=' ' file
awk-F'*''$2Hmm如果输入是str='4*1 13*5 19*31 26*7 31*1 52*4 60*6 80*2'
我被这个解决方案吸引住了,但是字符串是4*1 13*5 19*31 26*13 31*11 52*28 60*6 80*2怎么样,我想删除“B”>=13的字段最终正则表达式将变得不可管理,但对于13,您可以将[1-4]\y
更改为([1-9]|1[0-2])\y
,读作:一位数字或10,11或12。非常聪明,非常聪明!很好的问题,因为我经常在awk中处理复合字段(谢谢你的措辞!)。目前,只有两个“维度”可以拆分文本(在记录和字段中)。有些黑客有时是可能的,如在公认的答案中,记录分隔符被误用,只有在只有一行的情况下才有效。我还使用了split
来解决不同但相关的问题,但最好在记录和字段旁边有一个三维空间。
$ awk 'BEGIN{RS=ORS=" "} /[0-9]+\*[1-4]\y/'
awk -F'*' '$2<5' RS=' ' ORS=' ' file