Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 根据子字段值删除复合字段_Bash_Awk_Sed - Fatal编程技术网

Bash 根据子字段值删除复合字段

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++){

我有一个文件包含“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++){
                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