我正在尝试使用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的示例,但它们只检测最后一个文件的最后一行 。
答案 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
其中前两行似乎相当不言自明; BEGINFILE
和ENDFILE
分别是在处理文件的开头和结尾应用的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