Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 awk在使用IGNORECASE时保留标题_Bash_Awk_Ignore Case - Fatal编程技术网

Bash awk在使用IGNORECASE时保留标题

Bash awk在使用IGNORECASE时保留标题,bash,awk,ignore-case,Bash,Awk,Ignore Case,我有一个csv文件,我想在特定列columnB(我的数据集中的第5列)(大小写被忽略)中搜索字符串,并在另一列columnC(我的数据集中的第10列)上应用过滤器。然后将所选列保存到文件中 数据集的示例 columnA columnB columnC columnD abc Apple 100 today nbd apple 50 tomorrow ccc apple 101

我有一个csv文件,我想在特定列
columnB
(我的数据集中的第5列)(大小写被忽略)中搜索字符串,并在另一列
columnC
(我的数据集中的第10列)上应用过滤器。然后将所选列保存到文件中

数据集的示例

columnA     columnB    columnC  columnD
abc          Apple      100     today
nbd          apple      50      tomorrow
ccc          apple      101     today
期望输出

columnB    columnC
Apple      100
apple      101
使用
awk
时出现的问题我可以选择
columnB
,但无法输出标题

 awk 'BEGIN {IGNORECASE = 1} {if($5 == "Apple") print $0 }' Data.csv> testPipe.txt
我尝试过使用
NR==1
,但由于某些原因,它不能与
IGNORECASE
一起使用

我也尝试了这些方法和技巧。 我尝试使用
夹点
,我可以输出标题,但无法为字符串匹配指定
columnB
。搜索将应用于所有列

cat Data.csv |{ head -1; grep -I "Apple";} | awk -F',' '{ if ($10 >100 ) { print } }'>testPipe.txt
是否有一种方法可以将这两种方法结合起来并获得所需的输出?
谢谢更新:显然我的回答没有我想象的那么好,请看下面埃德·莫顿的评论。不管怎样,我都会保留它,作为一个“如何不做它”

原始(错误)答案:

在设置IGNORECASE之前或之后,将以下内容添加到BEGIN子句中:

getline;
print;
说明:BEGIN子句在执行其他所有操作之前执行一次,因此您也可以在那里处理行,但您必须手动读取它们

完整示例:

awk '
    BEGIN {
        getline;
        print;
        IGNORECASE = 1;
    }

    $2 == "apple" && $3 <= 100 {
        print $1;
    }
'
awk'
开始{
getline;
印刷品;
IGNORECASE=1;
}

$2==“apple”&&$3更新:显然我的答案没有我想象的那么好,请参见下面Ed Morton的评论。不管怎样,我都会保留它,作为一个“如何不做它”

原始(错误)答案:

在设置IGNORECASE之前或之后,将以下内容添加到BEGIN子句中:

getline;
print;
说明:BEGIN子句在执行其他所有操作之前执行一次,因此您也可以在那里处理行,但您必须手动读取它们

完整示例:

awk '
    BEGIN {
        getline;
        print;
        IGNORECASE = 1;
    }

    $2 == "apple" && $3 <= 100 {
        print $1;
    }
'
awk'
开始{
getline;
印刷品;
IGNORECASE=1;
}

$2==“apple”&&$3使用函数
tolower()

说明:

# Print the headers
NR==1 {
    print
    next
}

# Print the current line if $5 matches the condition
# Note that if there is no action specified, awk will
# use print $0 by default
tolower($5)
如果要在条件为真时编写进一步的操作,请将它们放入块中

tolower($5) {
    ...
}

与仅适用于GNU awk的
IGNORECASE
相反,
tolower()
将适用于任何版本的
awk
,因为它是由POSIX定义的。

使用函数
tolower()

说明:

# Print the headers
NR==1 {
    print
    next
}

# Print the current line if $5 matches the condition
# Note that if there is no action specified, awk will
# use print $0 by default
tolower($5)
如果要在条件为真时编写进一步的操作,请将它们放入块中

tolower($5) {
    ...
}


与仅适用于GNU awk的
IGNORECASE
相反,
tolower()
将适用于
awk的任何版本,因为它是由POSIX定义的。

Wrt我曾尝试使用NR==1,但出于某种原因,它不适用于IGNORECASE。您是否尝试过
NR==1{print;next}
?这行很好,你建议我把这行加在哪里?在if条件下
awk'BEGIN{IGNORECASE=1}{if($5==“Apple”)NR==1{print;next}}'Data.csv>testPipe.txt
这是一个条件动作对,放在BEGIN规则之后。像
awk'BEGIN{IGNORECASE=1}NR==1{print;next}$5==“Apple”Data.csv>testPipe.txt
awk'BEGIN{IGNORECASE=1}NR==1{print;next}5==1{Apple”&$10>100'FData.csv>testPipeNew.csv
它只返回头。有空栏,这不正常吗?因为5永远不等于“苹果”????您缺少一个
$
报告,我曾尝试使用NR==1,但由于某些原因,它对IGNORECASE不起作用。您是否尝试了
NR==1{print;next}
?这行很好,你建议我把这行加在哪里?在if条件下
awk'BEGIN{IGNORECASE=1}{if($5==“Apple”)NR==1{print;next}}'Data.csv>testPipe.txt
这是一个条件动作对,放在BEGIN规则之后。像
awk'BEGIN{IGNORECASE=1}NR==1{print;next}$5==“Apple”Data.csv>testPipe.txt
awk'BEGIN{IGNORECASE=1}NR==1{print;next}5==1{Apple”&$10>100'FData.csv>testPipeNew.csv
它只返回头。有空栏,这不正常吗?因为5永远不等于“苹果”????您丢失了一个
$
,像这样吗<代码>awk'开始获取行;印刷品;{IGNORECASE=1}{if($5==“Apple”)print$0}'FData.csv>2222.csv
对不起,我是Bash的初学者。期待您的澄清。谢谢你,它工作得很好。我只需要将1改为0。它们是选择打印语句中特定列的一种方法吗?例如
{print$4、$5、$10}
,如果我想将结果保存在文本文件中,是否需要修改代码?谢谢我再次运行了代码。有些行与条件不匹配:(知道为什么会发生这种情况吗?你不需要/不想使用getline。请参阅@EdMorton,谢谢你的启发,我添加了这样的注释?
awk'BEGIN getline;print;{IGNORECASE=1}{if($5==“Apple”)print$0}'FData.csv>2222.csv
很抱歉,我是Bash的初学者。期待您的澄清。谢谢,它工作得很好。我只需要将1更改为0。它们是选择打印语句中特定列的一种方法吗?例如
{print$4,$5,$10}
如果要将结果保存到文本文件中,是否需要修改代码?谢谢,我再次运行了代码。某些行与条件不匹配:(知道为什么会发生这种情况吗?你不需要/不想使用getline。请参阅@EdMorton,谢谢你启发我,我添加了一条注释谢谢,你知道它会转换最终结果吗?你可以试试它。它对匹配的部分有效,并且不会改变情况。是否可以添加另一个条件,当我这样做时,它不会删除null。I这里可能做错了什么。
awk'NR==1{print;next}tolower($5)=“apple”&&$5!=“NULL”'FData.csv>match.csv
@leena当你对各种答案的注释提出更多要求时,会让人非常困惑。请不要这样做。而是用更新的数据样本和相关的预期答案更新原始问题