-1

我有一个包含这种格式信息的文件(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
4

2 回答 2

1

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

045002
045013
045018

然后你可以做

awk 'NR == FNR { n[$1] = 1; next } $1 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] = 1; next } NR != FNR && ($1 in n) { print }' numbers input.txt >output.txt
于 2018-05-13T18:31:25.017 回答
-1

如果numbers.txt是数字列表:

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

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

printf "^%s\n" 045002 045013 045018 | grep -f - input.txt > output.txt
于 2018-05-13T18:35:28.180 回答