使用 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"
我想使用 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"