我有一些文件的内容在不同文件之间有所变化。 每个文件有2个由空行分隔的行。 我从来不知道两个部分中有多少行或字符。
文件看起来像这样。
This is a file
with some text
and some more text
此代码仅提供每个部分的第一行。
awk 'BEGIN {RS="\n\n"; FS="\n";} {print $1 }' file
我需要将每个部分分开使用。
答案 0 :(得分:3)
打印第一部分:
sed '/^$/q' test.txt
打印第二部分:
sed '1,/^$/d' test.txt
答案 1 :(得分:3)
将RS
设置为空/空值以使awk对空行序列进行操作。
来自POSIX specification for awk:
<强> RS 强>
RS的字符串值的第一个字符应为输入记录分隔符;一个默认情况下。如果RS包含多个字符,则结果未指定。 如果RS为空,则记录由包含一个或多个空行的序列分隔,前导或尾随空白行不应在输入的开头或结尾处产生空记录,并且a应始终为字段分隔符,无论FS的值是什么。
答案 2 :(得分:3)
由于标记为bash
,因此可能还有原生bash解决方案。
sections=( )
current_section=
while REPLY=; IFS= read -r || [[ $REPLY ]]; do
if [[ $REPLY ]]; then
# preserve newlines within the sections
if [[ $current_section ]]; then
current_section+=$'\n'"$REPLY"
else
current_section+=$REPLY
fi
else
sections+=( "$current_section" )
current_section=
fi
done <file
这会将文件的各个部分放入名为sections
的bash数组中。
您可以像这样打印该数组的内容:
printf -- '---\n%s\n---\n' "${sections[@]}"
...或者根据需要进行迭代:
for section in "${sections[@]}"; do
: do something with "$section" here
done
答案 3 :(得分:0)
假设有两个部分,这个非常简单的Perl技巧将打印标准输出,直到遇到一个空行,然后其余部分出错;
perl -ne 'if (1../^$/) { print STDOUT } else { print STDERR }'
e.g。 猫tmp0 | perl -ne&#39; if(1 ../^$/) {print STDOUT} else {print STDERR}&#39; &GT; tmp1 2&gt; TMP2
TMP1:
This is a file
with some text
TMP2:
and some more text
答案 4 :(得分:0)
IFS=";"
sections=($(awk -v RS= '{print $0 ";"}' filename))
IFS=;
将内部字段分隔符从空格(默认)设置为分号
$(awk -v RS= '{print $0 ";"}' filename)
给出了用;
分隔的所有部分。
sections=(awk_output_here)
会根据IFS
拆分awk输出,并将每个部分转换为数组的元素。因此,sections
包含基于双换行的每个部分。