【问题标题】:Read a word in a given position from every line in a text file using shell script使用 shell 脚本从文本文件的每一行中读取给定位置的单词
【发布时间】:2015-03-18 11:05:57
【问题描述】:

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

我试过的代码是这样的。

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

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

【问题讨论】:

  • 请向我们展示您的代码(不仅仅是因为您卡在上面而无法编写的行)以及您到目前为止写的内容,然后是您卡住的部分。
  • 因为这个网站不是为了“这是我的问题,写我的代码”:)
  • 还想一想如何使它尽可能通用,以便对其他人有所帮助。过于针对 1 个人的问题可能会被关闭。
  • 对错误感到抱歉,我对此有点陌生。@MichaelDurrant

标签: scripting file-handling


【解决方案1】:

这在 PowerShell 中无法正常工作的原因是,Shell 代码几乎无法在 PS 中运行。您可以在 PowerShell 中使用大多数 DOS 命令,但是 FOR % 等的 ol' Shell 方法和类似的东西?不去。

它们不起作用的原因是 PowerShell 引入了新的非常强大的方法来执行您可以在 shell 代码/批处理中执行的操作,并且通常使用更少的代码。此外,进程的 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 空格字符,并从每一行中选择第二个单词。

完成的代码如下所示:

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

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

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

为什么是数字 1 而不是 2? PowerShell 数组从零开始,这意味着 1=列表中的第 2 项。在我的目录中运行该命令会得到以下结果:

this
is
the
word
I
want

【讨论】:

  • 出于好奇,我在一个文本文件中输入了所有行,并尝试通过将 -Path $_.FullName 替换为我的文件名来执行相同的操作。结果我得到了文本文件的第二行重复了大约 25 次。我哪里出错了?
  • 啊,我的方法是从每个文件中提取第二个单词,假设它们每个都有一行。对于多行文件,代码会略有变化。如果你想从一个文件的每一行中获取单词:Get-Content .\stackOneFile.txt | ForEach { $_.Split()[1]} 如果你想从目录中每个文件的每一行中获取第二个工作(在我的示例中。我有两个名为 stack 的文件,每个包含我之前六个文件中的所有行):dir stack* | ForEach { Get-Content $_ | ForEach { $_.Split()[1]} }
【解决方案2】:

如果你想使用 bash shell

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2011-08-24
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多