使用带有要提取的行号的第二个 .txt 文件,使用 sed 或 awk 从 .txt 文件中提取多行

Extract multiple lines from .txt file with sed or awk using a second .txt file with the line numbers to be extracted

我正在尝试从具有 200x10E6 行的 raw_data.txt 文件中提取多行。 要提取的行号 (>5000) 列在名为 lines.txt 的第二个 .txt 中 (每行一个行号)。

根据我在这里的发现,我尝试了两种使用 awk 和 sed 的方法:

awk 'NR == FNR {nums[]; next} FNR in nums' lines.txt raw_data.txt > selected_data.txt

sed ’s/$/p/‘ lines.txt | sed -n -f - raw_data.txt > selected_data.txt

在这两种情况下,selected_data.txt 文件都是空的。我假设要选择的大量行和 raw_data.txt 中的大量行阻止了正确执行,因为当我只选择很少的行 (<5) 时这两个命令都有效。

有解决这个问题的办法吗?谢谢

假设您有这两个文件:

cat lines
1
5
6
12

cat file.txt
line 1
line 2
line 3
...
line 23
line 24
line 25

您可以先阅读 lines,然后使用它来决定在 file.txt 中打印哪一行,如下所示:

awk 'FNR==NR{line[]; next} 
FNR in line' lines file.txt
line 1
line 5
line 6
line 12

这可能无法在您的 计算机上运行的原因通常是行结尾不是awk 所期望的。

试试这个:

awk '{printf("%s: %s\n", FNR, )}' lines
1: 1
2: 5
3: 6
4: 12

您还可以使用 Unix file 实用程序,它将显示以下之一:

file file.txt
file.txt: ASCII text

或:

file file.txt
file.txt: ASCII text, with CRLF line terminators

如果你的 awk 期望 \r\n 而只得到 \n 那可能是你的问题。

使用 dos2unixunix2dos 来解决这个问题。或者在awk中设置合适的RS=<what ever your line endings are>。如果你有 GNU awk,你可以做 RS="\r?\n" 并且它适用于 DOS 和 Unix 行尾。