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

Reading text in Linux shell and writing some specific rows to a new file

我有一个包含这种格式 (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; next }  in n' numbers input.txt >output.txt

awk 程序将 numbers 文件和您的 input.txt 文件作为输入。第一个块仅针对 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; next } NR != FNR && ( in n) { print }' numbers input.txt >output.txt

如果numbers.txt是一个数字列表:

sed 's/.*/^&/' numbers.txt | grep -f - input.txt > output.txt

或者数字可以在命令行上:

printf "^%s\n" 045002 045013 045018 | grep -f - input.txt > output.txt