awk从多列行中排除特定列

awk从多列行中排除特定列,awk,Awk,如何使用awk排除以300开头的列,而不排除以300开头的列?比如说 输入: 100230070 100214996 100214992 300230217 100227462 100231344 100223007 100230055 300000213 300000180 100230295 100230295 100222531 100230174 100230051 输出: 100230070 100214996 100214992 100227462 100231344 100223

如何使用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

尝试一下这款awk one liner:

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

awk'{for(i=1;i试试这个awk一行:

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

awk'{for(i=1;i下面的
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下面的
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另一个awk

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

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

awk'{for(i=1;i使用不带任何循环的awk:

awk '{gsub("^(300[^ ]* )+|( 300[^ ]*)+","")}1' file
不需要的数字(以
300
开头)可以位于行的开头或中间。可以删除at数字的多个连续序列(使用
+
regex运算符)

这显然可以在
sed
中轻松翻译:

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

使用不带任何循环的awk:

awk '{gsub("^(300[^ ]* )+|( 300[^ ]*)+","")}1' file
不需要的数字(以
300
开头)可以位于行的开头或中间。可以删除at数字的多个连续序列(使用
+
regex运算符)

这显然可以在
sed
中轻松翻译:

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

gsub
bing的另一个变体,但使用
FS
$1=$1
删除前导的
FS
s:

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

gsub
bing的另一个变体,但使用
FS
$1=$1
删除前导的
FS
s:

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

awk'{for(i=1;i awk'{for(i=1;i几乎。第一行合并了两列:100230070 100214996 10021499210027462100231344@JonyD现在应该可以了。差不多。第一行合并了两列:10023007100214996 1002149921002727462100231344@JonyD现在它应该走了。我正在尝试构建这个正则表达式…当然是最好的解决方案。这个似乎太难了+“,”)}1'或sed的//300[^]*//g'@ctac_u不完全正确,第四行开头有一个额外的空间,您是对的,只需使用第一行进行测试。使用sed,只需在末尾添加s/^*//,但使用awk,您的答案更好。@ctac_u若要消除额外的空间,请使用
$1=$1
重新生成记录,即
awk'{gsub(^(^))(300[^]*)+“,”;$1=$1}1'文件
我试图构建这个正则表达式…当然是最好的解决方案。这个似乎太难了,{gsub((^))(300[^]*)+“,”)}1'或sed的/^\\ 300[^]*//g'@ctac_u不完全正确,第四行的开头有一个额外的空格。你是对的,只使用第一行进行测试。使用sed,只需在末尾添加s/^*//但是使用awk,你的答案更好。@ctac_u若要消除多余的空格,请使用
$1=$1
重新生成记录,即
awk'{gsub((^)(300[^]*+),“;$1=$1}1'文件