Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Can';不能解释Awk的行为_Bash_Awk - Fatal编程技术网

Bash Can';不能解释Awk的行为

Bash Can';不能解释Awk的行为,bash,awk,Bash,Awk,我是bash脚本的新手。在我的脚本中,我需要从文本文件中删除不以“a”字符开头的行,将这些行写入temp.txt文件。我使用awk的这种语法来完成这项工作 read value awk '($1 != "$value" ) ' file1.txt > temp.txt 当我运行脚本时,它会在开头显示所有不以值开头的行,然后是以值开头的行。 有人能给我解释一下为什么会发生这种情况,并最终建议我改正吗?基本上你可以使用grep: grep -v '^a' file1 > file2

我是bash脚本的新手。在我的脚本中,我需要从文本文件中删除不以“a”字符开头的行,将这些行写入temp.txt文件。我使用awk的这种语法来完成这项工作

read value
awk '($1 != "$value" ) ' file1.txt > temp.txt
当我运行脚本时,它会在开头显示所有不以值开头的行,然后是以值开头的行。
有人能给我解释一下为什么会发生这种情况,并最终建议我改正吗?

基本上你可以使用
grep

grep -v '^a' file1 > file2
^
匹配行的开头<代码>^a与行首的
a
匹配
-v
否定匹配,意味着grep将输出所有不以
a
开头的行

如果要将变量传递给该命令,则需要使用双引号而不是单引号:

grep -v "^$value" file1 > file2
但是请注意,
$value
将被解释为正则表达式。意思是如果
value=。
例如,它将匹配任何字符,而不仅仅是文本

为了避免这种情况,awk再次出现在我的脑海中,这是我最后的建议:

awk -v value="$value" 'substr($0,0,length(value)) != value' file1 > file2

基本上,您可以使用
grep

grep -v '^a' file1 > file2
^
匹配行的开头<代码>^a与行首的
a
匹配
-v
否定匹配,意味着grep将输出所有不以
a
开头的行

如果要将变量传递给该命令,则需要使用双引号而不是单引号:

grep -v "^$value" file1 > file2
但是请注意,
$value
将被解释为正则表达式。意思是如果
value=。
例如,它将匹配任何字符,而不仅仅是文本

为了避免这种情况,awk再次出现在我的脑海中,这是我最后的建议:

awk -v value="$value" 'substr($0,0,length(value)) != value' file1 > file2

变量不以单引号展开。您的脚本所做的是,它排除了所有以字符串
$value
开头并后跟空格的行。

变量不会用单引号展开。您的脚本所做的是,它排除了所有以字符串
$value
开头并后跟空格的行。

awk-v val=“$value”'$1!=val'file1.txt>temp.txt
awk-v val=“$value””$1!=val'file1.txt>temp.txt
空格在引号之外,因此不是匹配的一部分。@EtanReisner:但是
$value
后面跟着空格,否则下面的字符将是$1的一部分,对吗?我使用grep命令解决了…但是我真的想得到一个解决方案,即使是awkYeah,OP不完全清楚值是否是整个第一个字段,这使获得“正确”的解决方案变得复杂。空格在引号之外,因此不属于匹配的一部分。@EtanReisner:但是
$value
后跟空格,否则下面的字符将是$1的一部分,对吗?我用grep命令解决了…但我真的很想得到一个解决方案,即使使用awkYeah,OP也不完全清楚该值是否是整个第一个字段,这使得获得“正确”的解决方案变得复杂。为什么要避免像OP尝试的那样在
$1
上直接使用
=
?鉴于变量为regex的警告,为什么首先推荐
grep
?@EtanReisner Op说:行不是以某个字符开头的。但是是的,我可以使用
-F'
,然后选中
$1
,这是真的。说得好。但是,由于问题中的
read
命令没有限制长度,因此我建议的最后
awk
命令是最灵活的解决方案。关于grep,如果regex字符不是问题,甚至不是需要的,那么grep是最好的解决方案。这就是为什么我添加了它并从它开始。为什么要避免像OP尝试的那样在
$1
上直接使用
==
?鉴于变量为regex的警告,为什么首先推荐
grep
?@EtanReisner Op说:行不是以某个字符开头的。但是是的,我可以使用
-F'
,然后选中
$1
,这是真的。说得好。但是,由于问题中的
read
命令没有限制长度,因此我建议的最后
awk
命令是最灵活的解决方案。关于grep,如果regex字符不是问题,甚至不是需要的,那么grep是最好的解决方案。这就是为什么我添加了它,并从它开始。