【问题标题】:Command "grep | cut" in shell programmingshell编程中的命令“grep | cut”
【发布时间】:2021-07-28 15:50:10
【问题描述】:

grep 命令有问题。

我有一个名为 dictionary.txt 的文件,其中包含 2 列单词,例如

abc def
apple orange
hour minute

在我的 Bash 脚本中,在左栏中输入单词作为参数后,我必须使用 grep 命令在右侧输出相应的单词。

要求是使用循环。

我创建了这个脚本:

#!/bin/bash

parola=$1

for traduzione in $( sort dictionary.txt )
do
     if [ $parola == $traduzione ]
     then
     grep $traduzione | cut -f 2 dictionary.txt
     fi
done

如上所述,这不起作用。

【问题讨论】:

  • 您的脚本中有许多 潜在 问题(超出我的评论范围),但您没有告诉我们具体是什么,确切,你有问题,所以很难回答。
  • grep | cut 几乎总是更好的拼写 awk
  • cut 的具体问题是它需要制表符分隔的输入,而不是空格分隔。
  • 在这里对文件进行排序似乎完全是多余的。

标签: bash shell unix grep


【解决方案1】:

我建议将整个 for 循环替换为

awk -v word="$parola" '$1 == word{print $2;exit}' dictionary.txt

在哪里

  • -v word="$parola"parola 变量传递给 awk 脚本
  • $1 == word 检查第 1 列的值是否等于 parola
  • {print $2;exit} - 打印 Column2 值并退出(如果您需要其他行上的所有匹配项,请删除 exit)。

dictionary.txt

abc def
apple orange
hour minute

script.sh 一样

#!/bin/bash
parola=$1
awk -v word="$parola" '$1 == word{print $2; exit}' dictionary.txt

bash script.sh apple 返回orange

如果您需要 for 循环,您可以使用


#!/bin/bash
parola=$1

while IFS= read -a line; do
  read -r left right <<< "$line"
  if [ "$left" == "$parola" ]; then
     echo "$right";
  fi
done < dictionary.txt

即:

  • 逐行读取dictionary.txt,将当前行值赋给line变量
  • 将一行中的值读入leftright变量
  • 如果left 等于right,则打印right

【讨论】:

  • 显然,在我输入我的答案时,您正在输入答案,但我承认,您的答案比我的更完整 :-)
  • 谢谢,但是如果我想用 for 来做呢?
  • @AlessioScalzo 我添加了另一个带有循环的变体。
  • @AlessioScalzo 您不想为此使用 for 循环。你只想要sort dictionary.txt | awk ...
【解决方案2】:

你为什么使用for-loop?

grep -w "word1" dictionary.txt

这会向您显示可以找到该单词的行,因此甚至不需要for-loop。供您参考,-w 的意思是“只取整个单词”。

【讨论】:

  • 我必须使用 for 因为我有使用 for 的特定要求 :-)
  • 如答案中所述,您接受了,有两种可能性:您使用for-loop,逐行读取并解析该行,或者您使用grep 查找您正在寻找的确切线路。将forgrep 结合起来是没有意义的(至少在这种情况下)。
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 2013-11-21
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多