shell - 我可以使用 grep 提取 CSV 文件的单列吗?

标签 shell csv grep

我正在努力解决我必须尽快解决的问题。
我有一个 csv 文件,字段以 ; 分隔。
我被要求使用 grep 制作一个 shell 命令,以使用正则表达式仅列出第三列。我不能使用剪切。这是一个练习。

我的文件是这样的:

1;Evan;Bell;39;Obigod Manor;Ekjipih;TN;25008
2;Wayne;Watkins;22;Lanme Place;Cotoiwi;NC;86578
3;Danny;Vega;25;Fofci Center;Momahbih;MS;21027
4;Larry;Robinson;23;Bammek Boulevard;Gaizatoh;NE;27517
5;Myrtie;Black;20;Savon Square;Gokubpat;PA;92219
6;Nellie;Greene;23;Utebu Plaza;Rotvezri;VA;17526
7;Clyde;Reynolds;19;Lupow Ridge;Kedkuha;WI;29749
8;Calvin;Reyes;47;Paad Loop;Beejdij;KS;29247
9;Douglas;Graves;43;Gouk Square;Sekolim;NY;13226
10;Josephine;Estrada;48;Ocgig Pike;Beheho;WI;87305
11;Eugene;Matthews;26;Daew Drive;Riftemij;ME;93302
12;Stanley;Tucker;54;Cure View;Woocabu;OH;45475
13;Lina;Holloway;41;Sajric River;Furutwe;ME;62184
14;Hettie;Carlson;57;Zuheho Pike;Gokrobo;PA;89098
15;Maud;Phelps;57;Lafni Drive;Gokemu;MD;87066
16;Della;Roberson;53;Zafe Glen;Celoshuv;WV;56749
17;Cory;Roberson;56;Riltav Manor;Uwsupep;LA;07983
18;Stella;Hayes;30;Omki Square;Figjitu;GA;35813
19;Robert;Griffin;22;Kiroc Road;Wiregu;OH;39594
20;Clyde;Reynolds;19;Lupow Ridge;Kedkuha;WI;29749
21;Calvin;Reyes;47;Paad Loop;Beejdij;KS;29247
22;Douglas;Graves;43;Gouk Square;Sekolim;NY;13226
23;Josephine;Estrada;48;Ocgig Pike;Beheho;WI;87305
24;Eugene;Matthews;26;Daew Drive;Riftemij;ME;93302

我想我应该使用类似的东西: cat < test.csv | grep'正则表达式'。

谢谢。

最佳答案

适合工作的正确工具:使用 awkcut
假设您想将第三列与特定字段匹配:

awk -F';' '$3 ~ /Foo/ { print $0 }' file.txt

...将打印第三个字段包含 Foo 的任何行. (将 print $0 更改为 print $3 将仅打印第三个字段)。

如果您只想打印第三列,请使用 cut :cut -d';' -f3 <file.txt
错误的工作工具:使用 GNU grep
grep 的系统上有 -o选项,您可以将两个实例链接在一起 - 一个用于修剪第四列之后的所有内容(并删除少于四列的行),另一个仅取最后剩余的列(因此,第四列):
str='foo;bar;baz;qux;meh;whatever'
grep -Eo '^[^;]*[;][^;]*[;][^;]*[;][^;]*' <<<"$str" \
  | grep -Eo '[^;]+$'

要解释它是如何工作的:
  • ^ , 在方括号之外,仅匹配行首。
  • [^;]*匹配除 ; 之外的任何字符零次或多次。
  • [;]仅匹配字符 ; .

  • ...因此,每个 [^;]*[;]在正则表达式中匹配单个字段,无论该字段是否包含文本。将其中四个放在第一阶段意味着我们只匹配字段,而 grep -o告诉 grep只发出它成功匹配的内容。

    关于shell - 我可以使用 grep 提取 CSV 文件的单列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47638184/

    相关文章:

    linux - 使用脚本在 bash 中创建文件的多个副本

    php - Excel 生成的 CSV,特殊字符消失 (ÆØÅ) - PHP

    regex - 使用 Grep 和 Regex 在一行中搜索多个匹配项

    bash - 使用 Grep(或任何其他命令行工具)来计算包含不同模式的行

    python - 从 csv 文件读取数据框时如何设置列?

    linux - 如何格式化、枚举和执行 LDAP 查询结果中的每一行?

    bash - 如何确定我所在的当前交互式 shell(命令行)

    docker中的bash文件没有执行

    java - 如何从 Java 程序中异步运行 shell 脚本

    csv - 如何在 Codeigniter 中下载带有融合图表的 csv