读取 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
我有一个包含这种格式 (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