使用AWK合并文件,同时在之前和之后添加分隔符

时间:2015-02-28 21:16:51

标签: awk

我正在尝试使用AWK执行以下操作:

  • 从文件夹中读取一系列文件。
  • 将所有这些合并到一个文件中。
  • 在这样做的时候,我想在每个文件的开头和结尾放置一个分隔符(实际上是一段代码,打开和关闭标签,但在本例中我使用一个简单的分隔符为了清楚起见)。

我想在输出中看到的内容:

--Separator : Beginning of File--
  ((Content of file1.txt))
--Separator : End of File--
--Separator : Beginning of File--
  ((Content of file2.txt))
--Separator : End of File--
--Separator : Beginning of File--
  ((Content of file3.txt))
--Separator : End of File--

等...

我有这个代码片段,适用于"文件的开头"分离器:

INPUT="../folder/*.txt"
OUPUT="../output.txt"

awk 'FNR==1{print "--Separator : Beginning of File--"}{print}' $INPUT > $OUTPUT

现在我试图找出下一步:检测每个文件的结尾,并在那里放一个分隔符。

我找到了几个与单个文件操作一起使用END的示例,但它们只检测最后一个文件的最后一行

2 个答案:

答案 0 :(得分:3)

使用GNU awk,只需

awk 'BEGINFILE { print "--Separator : Beginning of File--" } ENDFILE { print "--Separator : End of File--" } 1' file1 file2 file3

格式可读:

BEGINFILE { print "--Separator : Beginning of File--" }
ENDFILE   { print "--Separator : End of File--" }
1

其中前两行似乎相当不言自明; BEGINFILEENDFILE分别是在处理文件的开头和结尾应用的GNU特定条件。最后一种是不变的打印线的惯用方法。 1表示为true,因此此条件适用于所有行,如果没有关联的操作,则会为它们执行默认操作 - 打印。

POSIX-一致地:

awk 'BEGIN { start = "--Separator : Beginning of File--"; end = "--Separator : End of File--"; print start } FNR == 1 && FNR != NR { print end; print start } { print } END { print end }' file1 file2 file3

格式可读:

BEGIN {
  # In the beginning, put the separators in variables so we don't have to
  # repeat ourselves
  start = "--Separator : Beginning of File--"
  end   = "--Separator : End of File--"

  # and print the first beginning separator
  print start
}

# For the first line of all files (FNR == 1) except that of the first
# file (in the first file, the file record number FNR is equal to the
# overall record number NR, so FNR != NR tests for this)
FNR == 1 && FNR != NR { 
  # print the end separator for the previous file
  # and the start separator for this one.
  print end
  print start
}

# print all lines unchanged (no condition means it applies unconditionally)
{ print }

END {
  # and in the end, print the last end separator.
  print end
}

答案 1 :(得分:2)

如果你没有与awk绑定,那么在shell中它非常简单:

for file in ../folder/*.txt; do
    echo "--start"
    cat "$file"
    echo "--end"
done > ../output.txt