【问题标题】:print line that matches first field (bash)打印与第一个字段匹配的行(bash)
【发布时间】:2014-08-27 20:30:19
【问题描述】:

我正在尝试读取用户输入,使其与 csv 文件的第一个字段匹配,然后打印出整行。这是我想出的:

#/bin/bash
echo "enter number: "
read USERINPUT
LINENUMBER=$(awk -v FS=',' '{print $1}' < test.csv | grep -n "$USERINPUT") 
FULLLINE=$(sed -n $LINENUMBER\p test.csv)
echo $FULLLINE

我遇到的问题是我设置了 USERINPUT=4 但我的 csv 文件有几行,如 4、421、444 等。我匹配所有这些。我该怎么做

grep -n "$USERINPUT" 

只匹配它设置的内容而不匹配其他内容?

【问题讨论】:

  • 改掉使用 ALL_CAPS_VARNAMES 的习惯:有一天你会写 PATH=foo 然后想知道为什么你的脚本坏了。
  • Grep 支持 \&lt; 用于“左字边界”和 \&gt; 用于“右字边界”。搜索 \&lt;4\&gt; 仅找到 '4' 本身而不捕获 421444 等。

标签: regex bash csv awk sed


【解决方案1】:

而不是打印每一行的第一列,然后使用grep,你应该在 awk 中完成整个事情:

line_number=$(awk -F, -v s="$number" '$1==s{print NR}' test.csv)

如果您只想打印该行,那很简单:

awk -F, -v s="$number" '$1==s' test.csv

顺便说一句,您可以使用read -p,而不是使用echo 后跟read,它允许您指定提示:

read -p "enter number: " number

【讨论】:

  • 谢谢!我知道我可以在 awk 中做到这一切,但我的 awkfoo 是弱酱。非常感谢。
  • 如果测试中的行类似于my 4 input, more info。用户输入是4。这不会命中,因为除以, 将得到$1 = my 4 input
  • @Jotne 从问题来看,该字段似乎只是“4”。
【解决方案2】:
#/bin/bash
read -p "enter number: " num
grep "^$num," test.csv

【讨论】:

  • 您可能应该使用egrep "^$num(,|$)",这样即使文件中只有一个字段也可以使用,如果您希望用户能够指定多行,您甚至可以使用egrep "^($num)(,|$)"同时与3|7|123* 或...
【解决方案3】:

-o grep 选项仅打印与正则表达式匹配的内容。

例如

grep -o '.*USERINPUT.*' 

grep -o '^USERINPUT.*' 

等等。

【讨论】:

    【解决方案4】:
    #/bin/bash
    echo "enter number: "
    read USERINPUT
    # for a var assignation and print content
     FULLLINE=$(egrep "^${USERINPUT%% *}," test.csv )
     echo $FULLLINE
    # for only a print
     egrep "^${USERINPUT%% *}," test.csv
    
    • 使用 egrep 包括分隔符(输入周围的起始行和逗号)
    • 使用小输入测试通过${VarName%% *}删除尾随空格

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2019-01-08
      • 2018-03-25
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多