如何使用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
答案 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开头的字段