使用 shell 脚本从文本文件的每一行中读取给定位置的单词

Read a word in a given position from every line in a text file using shell script

我想使用 Shell 脚本从文本文件中读取每一行的特定单词(比如位于第二位)。我更喜欢 shell 脚本,因为它更容易实现其余功能。我目前坚持从文本文件中一个一个地提取第二个词,以便我可以使用该词来搜索包含它的文件。由于我是新手,所以我没有尝试太多。

我试过的代码是这样的

SETLOCAL
(FOR /L %%i IN (1,1,2) DO SET /P line=) < sql.txt
> another.txt ECHO %line%
ENDLOCAL

我 运行 它在 Windows cmd 中使用 powershell 但它说 < 运算符保留供将来使用。

在 PowerShell 中 无法正常工作 的原因是 Shell 代码在 [=43] 中不会 运行 =],差不多。您可以在 PowerShell 中使用大多数 DOS 命令,但是 FOR % 等的 ol' Shell 方法和诸如此类的东西?不行。

它们不起作用的原因是 PowerShell 引入了新的非常强大的方法来完成您可以在 shell code/batch 中完成的事情,而且通常代码更少。此外,流程的 PowerShell 代码方法通常更易于阅读和理解。所以,在这个序言之后,这是你在 PowerShell:

中的做法

我创建了六个文本文件,下面列出了它们包含的内容:

so this is the
so is is the
so the is the
so word is the
so I is the
so want is the

如您所见,如果您阅读第二个词,这是有道理的。我们在 PowerShell 中可以做的是 运行 DIR 命令获取此目录中的文件列表,然后将其发送到 Get-Content cmdlet——现代相当于 type.exe--这将读取文本文件。然后我们可以 .Split 在 space 字符上,select 每行的第二个单词。

完成的代码如下所示:

dir | ForEach { (get-content -Path $_.FullName).split()[1]}

PowerShell 的一般流程是,当您使用“|”时,一个命令的输出成为另一个命令的输入管道字符。所以这个例子中发生的事情是:

  • 我们正在 运行ning DIR,它为我们提供了文件列表。
  • 我们将其发送到 ForEach cmdlet,它将 运行 给定的 {scriptblock} 代码一次用于列表中的每个项目,替换 $_ 字符的项目属性。
  • 我们用它来 运行 Get-Content,列出文件的内容
  • 然后我们使用 PowerShell 的 .Split 方法在 space 上进行拆分,然后在
  • 上进行拆分
  • select 第二项使用 [1].

为什么数字是 1 而不是 2? PowerShell 数组从零开始,这意味着 1=列表中的第 2 项。 运行 我的目录中的命令给出了这样的结果:

this
is
the
word
I
want

如果你想使用 bash shell

     filename=""
      while read -r line
       do
        echo "$line" | awk '{print }' 
       done < "$filename"