awk从多列行中排除特定的列

时间:2018-06-21 12:44:50

标签: awk

如何使用awk排除以300开头的列,而不排除具有300的列?例如

输入:

100230070 100214996 100214992 300230217 100227462 100231344
100223007
100230055
300000213 300000180 100230295
100230295 100222531 100230174 100230051

输出:

100230070 100214996 100214992 100227462 100231344
100223007
100230055
100230295
100230295 100222531 100230174 100230051

5 个答案:

答案 0 :(得分:3)

使用awk没有任何循环:

awk '{gsub("^(300[^ ]* )+|( 300[^ ]*)+","")}1' file

不需要的数字(以300开头)可以在行的开头或中间。可以删除at编号的几个连续序列(使用+正则表达式运算符)

显然可以轻松地将其翻译成sed

sed -E 's/^(300[^ ]* )+|( 300[^ ]*)+//' file

答案 1 :(得分:2)

尝试一下这种单线:

awk '{for(i=1;i<=NF;i++)sub(/^300.*/," ",$i)}
     1+gsub(/ +/," ")+sub(/^ /,"")' file

-sub()函数进行基于正则表达式的替换,将用空字符串替换以300开头的所有字段,这将留空FS。 -最后的gsub() and sub(),将合并空白并使输出漂亮。

答案 2 :(得分:2)

遵循awk可能会对您有所帮助。

awk '{for(i=1;i<=NF;i++){if($i~/^300/){$i=""}};gsub(/[[:space:]]+/,FS);gsub(/^[[:space:]]+|[[:space:]]+$/,"")} 1' Input_file

现在也添加一种非衬套形式的解决方案。

awk '
{
  for(i=1;i<=NF;i++){
    if($i~/^300/){ $i="" }};
  gsub(/[[:space:]]+/,FS);
  gsub(/^[[:space:]]+|[[:space:]]+$/,"")
}
1
'  Input_file

说明:也在此处添加说明。

awk '
{
  for(i=1;i<=NF;i++){                   ##Starting a for loop from variable i value 1 to till value of NF(number of fields) here.
    if($i~/^300/){ $i="" }};            ##Checking condition if a column starts with 300 then nullify its value.
  gsub(/[[:space:]]+/,FS);              ##Using gsub to substitute spaces all occurrences with a single space.
  gsub(/^[[:space:]]+|[[:space:]]+$/,"")##Uinsg gsub for replacing starting space and ending space with NULL.
}
1                                       ##Mentioning 1 to print the edited or non-edited line here.
' Input_file                            ##Mentioning Input_file name here.

答案 3 :(得分:2)

gsub bing的另一种变体,但具有FS$1=$1可以删除前FS个:

$ awk '{gsub("(^|" FS ")300[^" FS "]*","");$1=$1}1' file
100230070 100214996 100214992 100227462 100231344
100223007
100230055
100230295
100230295 100222531 100230174 100230051

答案 4 :(得分:1)

另一个awk

awk '{for(i=1;i<=NF;i++){if($i!~/^300/)printf "%s"$i FS};printf "%c","\n"}' infile

打印每个不以300开头的字段