过滤具有多个分隔符的字段

时间:2016-07-20 19:00:22

标签: awk

我已经做了大量的搜索,但是找不到我需要的东西。有一个这样的文件:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    Log.d(TAG, "onKeyUp: "+keyCode);
    if(!mPaused && keyCode==KeyEvent.KEYCODE_BACK){
        if(!mScript.onBackPressed())
            return true;
    }
    return super.onKeyUp(keyCode, event);
}

我想要做的是使用awk或其他东西从此文件返回行,并更改为字段4(管道分隔)。 Field 4有一个代字号和插入符作为分隔符,这是我正在努力的地方。我们希望返回的行如下:

aaa|bbb|ccc|ddd~eee^fff^ggg|hhh|iii

111|222|333|444~555^666^777|888|999

AAA|BBB|CCC||EEE|FFF

如果字段4为空,则按原样返回。但是当字段4有多个值时,我们希望仅在波形符返回后的第一个值。

2 个答案:

答案 0 :(得分:1)

 awk -F "[|^~]" 'BEGIN{OFS="|"}NF==6{print} NF==9{print $1,$2,$3,$5,$8,$9}' tmp.txt 

aaa|bbb|ccc|eee|hhh|iii
111|222|333|555|888|999
AAA|BBB|CCC||EEE|FFF

使用正则表达式作为分隔符
计算字段以决定做什么
将输出分隔符设置为管道

答案 1 :(得分:0)

~

此方法不对字段4以外的字段内容进行假设。例如,其他字段可能包含^-F'|'个字符,但不会影响结果。

如何运作

  • |

    这会将输入的字段分隔符设置为sub(/^[^~]*~/, "", $4)

  • ~

    如果字段4包含~,则会删除第一个~以及第一个sub(/\^.*/, "", $4)之前的所有内容。

  • ^

    如果字段4包含^,则会删除第一个1及其后的所有内容。

  • OFS='|'

    这是用于打印线的awk简洁速记。

  • |

    这会将输出中的字段分隔符设置为<?php class Entity { /** * @var array|stdClass|Collection|string **/ private $mixed; public function getMixedAsPhpArray(array $filter) { return EntityHelper::toPhpArray($this->mixed, $filter); } }