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
我们在这里做了什么
$1
,$2
到$(NF)
- 清空列ie
$(NF-5)=“”
- 从记录中删除由上述步骤形成的连续的
,即dosub(/\ \ \ \ \ \ \ \ \ \ \/,“\”)
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
我们在这里做了什么
$1
,$2
到$(NF)
- 清空列ie
$(NF-5)=“”
- 从记录中删除由上述步骤形成的连续的
,即dosub(/\ \ \ \ \ \ \ \ \ \ \/,“\”)
另一种选择是使用@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谢谢。谢谢。汤姆,这对我的案子有效。非常感谢,我学到了什么