awk使用固定分隔符从N列中删除第5列 我有第n列的文件 我想从第n列的最后一列中删除第5列 分隔符为“|”

awk使用固定分隔符从N列中删除第5列 我有第n列的文件 我想从第n列的最后一列中删除第5列 分隔符为“|”,awk,Awk,我使用如下所示的简单示例进行了测试: bash-3.2$ echo "1|2|3|4|5|6|7|8" | nawk -F\| '{print $(NF-4)}' 4 预期结果: 1|2|3|5|6|7|8 我应该如何更改命令以获得所需的输出?如果我正确理解您的意思,您希望使用以下内容: sed -E 's/\|[^|]*((\|[^|]*){4})$/\1/' 这将匹配管道字符\\\\\\\\\后跟任意数量的非管道字符[^\]*,然后再捕获4个相同模式的((\\\\\\\[^\]*){4

我使用如下所示的简单示例进行了测试:

bash-3.2$ echo "1|2|3|4|5|6|7|8" | nawk -F\| '{print $(NF-4)}'
4
预期结果:

1|2|3|5|6|7|8

我应该如何更改命令以获得所需的输出?

如果我正确理解您的意思,您希望使用以下内容:

sed -E 's/\|[^|]*((\|[^|]*){4})$/\1/'
这将匹配管道字符
\\\\\\\\\
后跟任意数量的非管道字符
[^\]*
,然后再捕获4个相同模式的
((\\\\\\\[^\]*){4})
。末尾的
$
与行的末尾匹配。比赛的第一部分(即比赛结束后的第五个场地)被取消

测试它:

$ sed -E 's/\|[^|]*((\|[^|]*){4})$/\1/' <<<"1|2|3|4|5|6|7"
1|2|4|5|6|7

在基本模式下,管道按字面解释,但捕获组和卷曲BRC的括号需要转义。

如果我理解正确,您希望使用以下内容:

sed -E 's/\|[^|]*((\|[^|]*){4})$/\1/'
这将匹配管道字符
\\\\\\\\\
后跟任意数量的非管道字符
[^\]*
,然后再捕获4个相同模式的
((\\\\\\\[^\]*){4})
。末尾的
$
与行的末尾匹配。比赛的第一部分(即比赛结束后的第五个场地)被取消

测试它:

$ sed -E 's/\|[^|]*((\|[^|]*){4})$/\1/' <<<"1|2|3|4|5|6|7"
1|2|4|5|6|7

在基本模式下,管道按字面解释,但捕获组和卷曲BRC的括号需要转义。

AWK是您的朋友:


样本输入

A|B|C|D|E|F|G|H|I
A|B|C|D|E|F|G|H|I|A
A|B|C|D|E|F|G|H|I|F|E|D|O|R|Q|U|I
A|B|C|D|E|F|G|H|I|E|O|Q
A|B|C|D|E|F|G|H|I|X
A|B|C|D|E|F|G|H|I|J|K|L
awk 'BEGIN{FS="|";OFS="|"}
      {$(NF-5)="";sub(/\|\|/,"|");print}' file
A|B|C|E|F|G|H|I
A|B|C|D|F|G|H|I|A
A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
A|B|C|D|E|F|H|I|E|O|Q
A|B|C|D|F|G|H|I|X
A|B|C|D|E|F|H|I|J|K|L
脚本

A|B|C|D|E|F|G|H|I
A|B|C|D|E|F|G|H|I|A
A|B|C|D|E|F|G|H|I|F|E|D|O|R|Q|U|I
A|B|C|D|E|F|G|H|I|E|O|Q
A|B|C|D|E|F|G|H|I|X
A|B|C|D|E|F|G|H|I|J|K|L
awk 'BEGIN{FS="|";OFS="|"}
      {$(NF-5)="";sub(/\|\|/,"|");print}' file
A|B|C|E|F|G|H|I
A|B|C|D|F|G|H|I|A
A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
A|B|C|D|E|F|H|I|E|O|Q
A|B|C|D|F|G|H|I|X
A|B|C|D|E|F|H|I|J|K|L
样本输出

A|B|C|D|E|F|G|H|I
A|B|C|D|E|F|G|H|I|A
A|B|C|D|E|F|G|H|I|F|E|D|O|R|Q|U|I
A|B|C|D|E|F|G|H|I|E|O|Q
A|B|C|D|E|F|G|H|I|X
A|B|C|D|E|F|G|H|I|J|K|L
awk 'BEGIN{FS="|";OFS="|"}
      {$(NF-5)="";sub(/\|\|/,"|");print}' file
A|B|C|E|F|G|H|I
A|B|C|D|F|G|H|I|A
A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
A|B|C|D|E|F|H|I|E|O|Q
A|B|C|D|F|G|H|I|X
A|B|C|D|E|F|H|I|J|K|L
我们在这里做了什么

  • 正如您所知,awk有特殊变量来存储记录中的每个字段,范围从
    $1
    $2
    $(NF)
  • 从最后一列中排除第5列非常简单
    • 清空列ie
      $(NF-5)=“”
    • 从记录中删除由上述步骤形成的连续的
      ,即do
      sub(/\ \ \ \ \ \ \ \ \ \ \/,“\”)

  • AWK是你的朋友:


    样本输入

    A|B|C|D|E|F|G|H|I
    A|B|C|D|E|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|D|O|R|Q|U|I
    A|B|C|D|E|F|G|H|I|E|O|Q
    A|B|C|D|E|F|G|H|I|X
    A|B|C|D|E|F|G|H|I|J|K|L
    
    awk 'BEGIN{FS="|";OFS="|"}
          {$(NF-5)="";sub(/\|\|/,"|");print}' file
    
    A|B|C|E|F|G|H|I
    A|B|C|D|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
    A|B|C|D|E|F|H|I|E|O|Q
    A|B|C|D|F|G|H|I|X
    A|B|C|D|E|F|H|I|J|K|L
    
    脚本

    A|B|C|D|E|F|G|H|I
    A|B|C|D|E|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|D|O|R|Q|U|I
    A|B|C|D|E|F|G|H|I|E|O|Q
    A|B|C|D|E|F|G|H|I|X
    A|B|C|D|E|F|G|H|I|J|K|L
    
    awk 'BEGIN{FS="|";OFS="|"}
          {$(NF-5)="";sub(/\|\|/,"|");print}' file
    
    A|B|C|E|F|G|H|I
    A|B|C|D|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
    A|B|C|D|E|F|H|I|E|O|Q
    A|B|C|D|F|G|H|I|X
    A|B|C|D|E|F|H|I|J|K|L
    
    样本输出

    A|B|C|D|E|F|G|H|I
    A|B|C|D|E|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|D|O|R|Q|U|I
    A|B|C|D|E|F|G|H|I|E|O|Q
    A|B|C|D|E|F|G|H|I|X
    A|B|C|D|E|F|G|H|I|J|K|L
    
    awk 'BEGIN{FS="|";OFS="|"}
          {$(NF-5)="";sub(/\|\|/,"|");print}' file
    
    A|B|C|E|F|G|H|I
    A|B|C|D|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
    A|B|C|D|E|F|H|I|E|O|Q
    A|B|C|D|F|G|H|I|X
    A|B|C|D|E|F|H|I|J|K|L
    
    我们在这里做了什么

  • 正如您所知,awk有特殊变量来存储记录中的每个字段,范围从
    $1
    $2
    $(NF)
  • 从最后一列中排除第5列非常简单
    • 清空列ie
      $(NF-5)=“”
    • 从记录中删除由上述步骤形成的连续的
      ,即do
      sub(/\ \ \ \ \ \ \ \ \ \ \/,“\”)

  • 另一种选择是使用@sjsam的输入文件

    $ rev file | cut -d'|' --complement -f6 | rev 
    
    A|B|C|E|F|G|H|I
    A|B|C|D|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
    A|B|C|D|E|F|H|I|E|O|Q
    A|B|C|D|F|G|H|I|X
    A|B|C|D|E|F|H|I|J|K|L
    

    我不确定你是要最后一个还是第六个的第五个。但是它很容易调整。

    另一种选择,使用@sjsam的输入文件

    $ rev file | cut -d'|' --complement -f6 | rev 
    
    A|B|C|E|F|G|H|I
    A|B|C|D|F|G|H|I|A
    A|B|C|D|E|F|G|H|I|F|E|O|R|Q|U|I
    A|B|C|D|E|F|H|I|E|O|Q
    A|B|C|D|F|G|H|I|X
    A|B|C|D|E|F|H|I|J|K|L
    

    我不确定你是要最后一个还是第六个的第五个。但是它很容易调整。

    谢谢您的帮助和指导

    以下是我测试的内容:

    bash-3.2$echo“1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9”| nawk'BEGIN{FS=“|”;OFS=“|”{$(NF-4)=”!“print}sed's/'

    产出:1 | 2 | 3 | 4 | 6 | 7 | 8 | 9


    在我从系统中提取的文件上进行了进一步测试,因此工作正常。

    感谢您的帮助和指导

    以下是我测试的内容:

    bash-3.2$echo“1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9”| nawk'BEGIN{FS=“|”;OFS=“|”{$(NF-4)=”!“print}sed's/'

    产出:1 | 2 | 3 | 4 | 6 | 7 | 8 | 9



    对我从系统中提取的文件进行了进一步测试,因此工作正常。

    从最后一列中删除第5行是什么意思?提供一个更清楚的答案。这个问题到目前为止没有任何意义。我想他的意思是,列的数量不是固定的,需要从最后一列中删除第五列!:)@sjsam@Inian:我明白了。感谢您的解释:)您的问题包括简洁、可测试的样本输入和预期输出,因此我们不会猜测您的需求,我们可以测试潜在的解决方案。从最后一列中删除第5行是什么意思?提供一个更清楚的答案。这个问题到目前为止没有任何意义。我想他的意思是,列的数量不是固定的,需要从最后一列中删除第五列!:)@sjsam@Inian:我明白了。感谢您的解释:)您的问题包括简洁、可测试的示例输入和预期输出,因此我们不会猜测您的需求,我们可以测试潜在的解决方案。如果您不打算使用捕获组,您也可以使用plain
    sub
    执行替换,然后打印该行。@TomFenech:是的,这将使解决方案更具可移植性谢谢。您不需要在
    子()
    上指定
    ,$0
    ,因为这是默认值,但更重要的是,如果您要删除的字段之前的字段为空,则此操作将失败。@EdMorton:请看要点。等待op对您的评论作出回应。@sjsam/Ed,以下是我在Solaris环境中根据预期对给定和测试进行的轻微修改:echo“1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9”| nawk“BEGIN{FS=“|”of=“|”}{(NF-4)=“;“print}”sed's/'1 | 2 | 3 | 4 | 6 | 7 | 8 | 9谢谢。如果您不打算使用捕获组,您最好使用普通的
    sub
    来执行替换,然后打印行。@TomFenech:是的,这将使解决方案更便于移植。。)谢谢。您不需要在
    子()
    上指定
    ,$0
    ,因为这是默认值,但更重要的是,如果您要删除的字段之前的字段为空,则此操作将失败。@EdMorton:请看要点。等待op对您的评论作出回应。@sjsam/Ed,以下是我在Solaris环境中根据预期对给定和测试进行的轻微修改:echo“1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9”| nawk“BEGIN{FS=“|”of=“|”}{(NF-4)=“;“print}”sed's/'1 | 2 | 3 | 4 | 6 | 7 | 8 | 9谢谢。谢谢。汤姆,这对我的案子有效。非常感谢,我学到了什么