linux - 在 Linux shell 中读取文本并将某些特定行写入新文件

标签 linux shell read-text

我有一个包含以下格式信息的文件(input.txt):

045002   1987244NDBC North L. Mich. 453086401 176  5
045002   1999140NDBC North L. Mich. 453186421 176  5
045002   2006117NDBC North L. Mich. 453386421 176  5
045002   2007127NDBC North L. Mich. 453386431 176  5
045002   2009138NDBC North L. Mich. 453486411 176  5
045007   1987244NDBC South L. Mich. 427087101 176  5
045007   1991091NDBC South L. Mich. 428087101 176  5
045007   1991154NDBC South L. Mich. 427087101 176  5
045007   1995237NDBC South L. Mich. 427087001 176  5
045007   1999140NDBC South L. Mich. 426787021 176  5
045007   2006117NDBC South L. Mich. 426887031 176  5
045007   2009127NDBC South L. Mich. 426787031 176  5
045007   2010133NDBC South L. Mich. 427086971 176  5
045007   2011145NDBC South L. Mich. 426887031 176  5
045007   2012100NDBC South L. Mich. 426787031 176  5
045013   2012212UWM Atwater Park WI 431087851 176  2
045014   2012224UWM Green Bay WI    448087761 176  2
045018   2011222CPD MontroseBeach IL419787641 176  3 00011110
045020   2007230UGLOS GrandTrav Bay 447985601 176  2

我需要在 Linux shell 中读取此文件并创建一个输出文件,其中包含基于第一列中的数字的输入文件的一些特定行,例如 045002、045013、045018。输出文件 (output.txt) 应如下所示:

045002   1987244NDBC North L. Mich. 453086401 176  5
045002   1999140NDBC North L. Mich. 453186421 176  5
045002   2006117NDBC North L. Mich. 453386421 176  5
045002   2007127NDBC North L. Mich. 453386431 176  5
045002   2009138NDBC North L. Mich. 453486411 176  5
045013   2012212UWM Atwater Park WI 431087851 176  2
045018   2011222CPD MontroseBeach IL419787641 176  3 00011110

最佳答案

假设您有一个文件,numbers,包含

045002
045013
045018

那么你可以这样做

awk 'NR == FNR { n[$1] = 1; next } $1 in n' numbers input.txt >output.txt

awk 程序将 numbers 文件和 input.txt 文件作为输入。第一个 block 仅针对 numbers 文件执行,并简单地创建一个以数字作为键的关联数组。当我们到达第二个文件时,我们测试第一列中的数字以查看它是否是数组中的键。如果是,则打印整行。

这将产生 output.txt

045002   1987244NDBC North L. Mich. 453086401 176  5
045002   1999140NDBC North L. Mich. 453186421 176  5
045002   2006117NDBC North L. Mich. 453386421 176  5
045002   2007127NDBC North L. Mich. 453386431 176  5
045002   2009138NDBC North L. Mich. 453486411 176  5
045013   2012212UWM Atwater Park WI 431087851 176  2
045018   2011222CPD MontroseBeach IL419787641 176  3 00011110

如果您希望 awk 程序完全明确:

awk 'NR == FNR { n[$1] = 1; next } NR != FNR && ($1 in n) { print }' numbers input.txt >output.txt

关于linux - 在 Linux shell 中读取文本并将某些特定行写入新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50319226/

相关文章:

c - 如何防止特定动态库被加载

python - 从 python 运行时,Docker 图像给我 "executable file not found in $PATH"

linux - 将变量从 htaccess 传递到 bash 脚本

linux - 如何使用 sed 和 wc 命令处理空格

useDelimiter() 中的 Java 错误

linux - 网络掩码对于公共(public) IP 意味着什么?

php - Jenkins 用户无法运行 composer install

用于获取和解码 kubernetes secret 的 Bash 函数

hana - CDS View 中的 READ_TEXT 类似功能