【问题标题】:how to search from the last column of a csv file using shell script and the result should contain all the columns如何使用 shell 脚本从 csv 文件的最后一列进行搜索,结果应包含所有列
【发布时间】:2021-07-27 19:49:49
【问题描述】:

我的 csv 文件(heart.csv)是这样的:

age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall,output
63,1,3,145,233,1,0,150,0,2.3,0,0,1,1
54,1,0,110,239,0,1,126,1,2.8,1,1,3,0
41,0,1,130,204,0,0,172,0,1.4,2,0,2,1
70,1,0,145,174,0,1,125,1,2.6,0,0,3,0
62,1,1,120,281,0,0,103,0,1.4,1,1,3,0
57,0,0,120,354,0,1,163,1,0.6,2,0,2,1

我想逐列搜索 CSV 文件.... 我只想要列 output 具有值 10 的那些行。我想使用 Shell 脚本 获得此结果。

我试过了:

echo "please enter pattern to search: "
read pattern
awk -v patt="$pattern" -F',' '$14 == patt' heart.csv

它适用于所有其他列。它只是不适用于最后一列。

输出文件应该是这样的(最后一列是'1'):

63,1,3,145,233,1,0,150,0,2.3,0,0,1,1
41,0,1,130,204,0,0,172,0,1.4,2,0,2,1
57,0,0,120,354,0,1,163,1,0.6,2,0,2,1

【问题讨论】:

    标签: linux bash shell csv


    【解决方案1】:

    听起来你的 csv 文件有 windows 行尾 \r\n 而不是 linux 行尾 \n。因此,文件最后一列中的每个值都以\r 结尾,并防止$14 == patt 永远为真(除非您有patt="...\r")。

    要解决此问题,您可以使用 dos2unix heart.csv 转换您的 csv 文件。

    如果您想保留 windows 行尾(即使在输出中)并拥有 GNU awk (check awk --version),那么您可以使用

    awk -v patt="$pattern" -F, -v RS='\r\n' -v ORS='\r\n' '$14 == patt'
    

    【讨论】:

    • 它不工作。它显示一条错误消息:- awk:1:意外字符'\'
    • 抱歉,我在ORS= 之前错过了一个-v。你能再试一次吗?
    【解决方案2】:

    如何从 csv 文件的最后一列开始搜索

    我建议使用grep 并使用正则表达式匹配所有以,1 结尾的行:

    grep ',1$' heart.csv
    

    输出:

    63,1,3,145,233,1,0,150,0,2.3,0,0,1,1
    41,0,1,130,204,0,0,172,0,1.4,2,0,2,1
    57,0,0,120,354,0,1,163,1,0.6,2,0,2,1
    

    【讨论】:

    • 它根本没有给我任何输出。
    • @ethanmeem 在这种情况下,请按照 Socowi 的建议先尝试dos2unixdos2unix < heart.csv | grep ',1$'
    • 抱歉,不允许修改输入文件
    • @ethanmeem dos2unix < heart.csv | grep ',1$' 不会改变输入文件。
    【解决方案3】:

    csvkit 是一个方便的工具包,用于处理 CSV 文件,包括 csvgrep

    $ csvgrep -c output -m 1 heart.csv                                                              age,sex,cp,trtbps,chol,fbs,restecg,thalachh,exng,oldpeak,slp,caa,thall,output
    63,1,3,145,233,1,0,150,0,2.3,0,0,1,1
    41,0,1,130,204,0,0,172,0,1.4,2,0,2,1
    57,0,0,120,354,0,1,163,1,0.6,2,0,2,1
    

    如果您的文件没有标题行,您也可以指定列号:csvgrep -H -c 14 -m 1 heart.csv

    (如果这是您遇到的问题,可以同时使用 CR 和 CRLF 样式的行尾,这很聪明)

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多