【问题标题】:How to read EOF and parse line by line using awk如何使用 awk 逐行读取 EOF 和解析
【发布时间】:2014-07-11 21:17:21
【问题描述】:

我的文件夹中有几个 txt 文件,其中包含大量数据。现在我必须通过一次从每个文件中读取一行来创建一个文件。新文件应如下所示:

foldername-file1.line1
foldername-file2.line1
fodlername-file3.line1
...then repeat the cycle
fodlername-file1.line2
fodlername-file2.lin2
fodlernam-file3.line2

fodlername-file1.line3
fodlername-file2.line3
fodlername-file3.line3

直到文件结束我必须连接文件。

我尝试使用 sed,但由于我有很多数据,它的性能很差。

counter=0
line=$(awk 'NR==n' n=$counter $filename)
echo $line >> $2

我正在循环递增计数器。我不知道如何检查文件的结尾。

使用粘贴命令,我无法在每个字符串中附加文件夹名称,并且当文件具有不同的输入行数时会附加额外的行

我自己解决了这个问题,只是想分享解决方案。 我使用了一个脚本,其中首先将所需的字符串附加到所有行,然后在命令下方运行以读取所有字符串 粘贴 -d '\n' 个文件* |awk '{if(length($0)>0) {print $0}}'

【问题讨论】:

  • @TomFenech 我刚刚对建议的编辑进行了小幅更正,我认为 OP 问题不适合这类 cmets,这就是 MSE 的用途。另外,在我看来,您的编辑实际上变化太大。 OP 指的是您现在已删除的 sed。

标签: awk


【解决方案1】:

您可以使用paste 命令并将分隔符设置为换行符。

paste -d'\n' file*

下面是它的工作原理:

假设您有以下文件:

$ head f*
==> f1 <==
1
2
3
4
5

==> f2 <==
11
12
13
14
15

==> f3 <==
21
22
23
24
25

$ paste -d'\n' f*
1
11
21
2
12
22
3
13
23
4
14
24
5
15
25

【讨论】:

  • 感谢 jaypal 的帮助。这工作正常。唯一的问题是每个文件都位于不同的文件夹中,例如:INPUTFILES/FOLDER1/file1、INPUTFILES/FOLDER2/file2、INPUTFILES/FOLDER3/file3。所有这些文件都在同一个主文件夹(INPUTFILES)下。我必须将文件夹名称附加到每一行。最终输出应该是: FOLDER1-line1 from file1 FOLDER2-line1 from file2 FOLDER3-line1 from file3 抱歉,我之前没有提到这一点,因为我以为我可以处理附加文件夹名称,但是我不使用粘贴命令不知道该怎么做。谢谢
  • @user3666144 您可以结合使用find。像paste -d'\n' $(find . -type f -printf "%h/%f ") 这样的东西。这需要 GNU find
  • 再次感谢。给定的命令很棒,但它几乎没有问题。它没有提供所需的 o/p。有重复的数据,很少有几行像这样的“文件夹名”-FNR!= EOF。我可以使用脚本,它不需要在单个命令中。
  • 当我们有不同大小的文件时,如何避免在输出文件中添加空行。比如 file1 有 3 行,而 file 2 有 10 行。在输出中,粘贴命令添加了额外的 7 行,并且第一个文件的行数更少。所以输出文件有3+10+7白线
  • @user3666144 您似乎有很多新要求。我建议关闭此问题并打开一个新问题,您可以在其中清楚地列出您的所有要求。
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多