Linux 在awk中使用空行作为文件分隔符

Linux 在awk中使用空行作为文件分隔符,linux,unix,awk,sed,Linux,Unix,Awk,Sed,我需要知道是否有可能在awk中使用一条新线作为场分离器,在一条线中引入多条线 例如: $ cat yo a aa aaa bb bbb bbb cccc ccccc cccc ddd dddd ddd eeeee eeeee eee fffff ffffff fffffff gggg ggggg hhhhhh hhhhhhh hhhhhhhhh iii iiiiiiiii iiiii jjjj jjjjj jjjjj kkkkk kkkkk l

我需要知道是否有可能在awk中使用一条新线作为场分离器,在一条线中引入多条线

例如:

$ cat yo  
a aa aaa  
bb bbb bbb  
cccc ccccc cccc  
ddd dddd ddd  
eeeee eeeee eee  

fffff ffffff fffffff  
gggg ggggg  
hhhhhh hhhhhhh hhhhhhhhh  

iii iiiiiiiii iiiii  
jjjj jjjjj jjjjj  
kkkkk kkkkk  
lllllllll lll ll  
下面是我小小的大脑能想到的几件事,但没有一件能帮上忙

cat file |awk -F'\n' '{print}'    
cat yo |awk 'NF'  '{print $NF}'  


cat yo |awk -F'/^$/d'  '{print $NF}'  
cat yo |awk -F'^$^[ \t]*$' '{print $NF}'  

cat yo |awk -F'^..' '{print $NF}'  

cat yo |awk -F'\t' '{print}'  
期望输出:

a aa aaa  bb bbb bbb cccc ccccc cccc ddd dddd ddd eeeee eeeee eee  
fffff ffffff fffffff gggg ggggg hhhhhh hhhhhhh hhhhhhhhh  
iii iiiiiiiii iiiii jjjj jjjjj jjjjj kkkkk kkkkk lllllllll lll ll  

您可以将记录分隔符定义为
RS=
,这将使其分段:每一行都是一个字段,每一条记录都是一个块:

$ awk -v RS= '{for (i=1; i<=NF; i++) printf "%s%s", $i, (i==NF?"\n":" ")}' file
a aa aaa bb bbb bbb cccc ccccc cccc ddd dddd ddd eeeee eeeee eee 
fffff ffffff fffffff gggg ggggg hhhhhh hhhhhhh hhhhhhhhh 
iii iiiiiiiii iiiii jjjj jjjjj jjjjj kkkkk kkkkk lllllllll lll ll

$awk-v RS='{for(i=1;i您可以将记录分隔符定义为
RS=
,这将使其具有段落性:每一行都是一个字段,每一条记录都是一个块:

$ awk -v RS= '{for (i=1; i<=NF; i++) printf "%s%s", $i, (i==NF?"\n":" ")}' file
a aa aaa bb bbb bbb cccc ccccc cccc ddd dddd ddd eeeee eeeee eee 
fffff ffffff fffffff gggg ggggg hhhhhh hhhhhhh hhhhhhhhh 
iii iiiiiiiii iiiii jjjj jjjjj jjjjj kkkkk kkkkk lllllllll lll ll

$awk-vrs='{for(i=1;i您可能希望重新定义记录分隔符而不是字段分隔符

引用
manawk

Records
   Normally, records are separated by newline characters.  You can control 
   how records are separated by assigning values to the built-in variable
   RS.  If RS is any single character, that character separates records.  
   Otherwise, RS is a regular expression.  Text in the input that  matches
   this  regular expression separates the record.  However, in compatibility 
   mode, only the first character of its string value is used for separating 
   records.  If RS is set to the null string, then records are separated by 
   blank lines.  When RS is set to the null string,  the  newline character 
   always acts as a field separator, in addition to whatever value FS may have.
所以试试这个

awk 'BEGIN{RS="\n\n";}{print NF;}'

您可能希望重新定义记录分隔符而不是字段分隔符

引用
manawk

Records
   Normally, records are separated by newline characters.  You can control 
   how records are separated by assigning values to the built-in variable
   RS.  If RS is any single character, that character separates records.  
   Otherwise, RS is a regular expression.  Text in the input that  matches
   this  regular expression separates the record.  However, in compatibility 
   mode, only the first character of its string value is used for separating 
   records.  If RS is set to the null string, then records are separated by 
   blank lines.  When RS is set to the null string,  the  newline character 
   always acts as a field separator, in addition to whatever value FS may have.
所以试试这个

awk 'BEGIN{RS="\n\n";}{print NF;}'

如果不使用任何约束来使用
awk
,只需使用一个循环,逐行读取即可:

while read -r line ; do 
  if [[ -z $line ]]; then echo ;  else echo -n $line;  fi 
done <file
读取时-r行;执行
如果[[-z$line]];则echo;否则echo-n$line;fi

完成如果不使用任何约束来使用
awk
,只需使用循环,逐行读取即可完成:

while read -r line ; do 
  if [[ -z $line ]]; then echo ;  else echo -n $line;  fi 
done <file
读取时-r行;执行
如果[[-z$line]];则echo;否则echo-n$line;fi

通过awk的gsub功能完成

$ awk -v RS="" '{gsub(/\n/,"")}1' file
a aa aaa  bb bbb bbb  cccc ccccc cccc  ddd dddd ddd  eeeee eeeee eee  
fffff ffffff fffffff  gggg ggggg  hhhhhh hhhhhhh hhhhhhhhh  
iii iiiiiiiii iiiii  jjjj jjjjj jjjjj  kkkkk kkkkk  lllllllll lll ll 

通过awk的
gsub功能

$ awk -v RS="" '{gsub(/\n/,"")}1' file
a aa aaa  bb bbb bbb  cccc ccccc cccc  ddd dddd ddd  eeeee eeeee eee  
fffff ffffff fffffff  gggg ggggg  hhhhhh hhhhhhh hhhhhhhhh  
iii iiiiiiiii iiiii  jjjj jjjjj jjjjj  kkkkk kkkkk  lllllllll lll ll 

在awk中执行此操作的方法很简单:

$ awk -v RS= '$1=$1' file
a aa aaa bb bbb bbb cccc ccccc cccc ddd dddd ddd eeeee eeeee eee
fffff ffffff fffffff gggg ggggg hhhhhh hhhhhhh hhhhhhhhh
iii iiiiiiiii iiiii jjjj jjjjj jjjjj kkkkk kkkkk lllllllll lll ll

在awk中执行此操作的方法很简单:

$ awk -v RS= '$1=$1' file
a aa aaa bb bbb bbb cccc ccccc cccc ddd dddd ddd eeeee eeeee eee
fffff ffffff fffffff gggg ggggg hhhhhh hhhhhhh hhhhhhhhh
iii iiiiiiiii iiiii jjjj jjjjj jjjjj kkkkk kkkkk lllllllll lll ll

这不会在beetween中连接没有空格的行吗?并且最好避免在输出行的末尾有额外的空格。编辑:我没有看到输入行以空格结尾。很抱歉。很好!还有
[-z“$line”]&&echo | | echo-n“$line”
就可以了。这不是在beetween中连接没有空格的行吗?而且最好避免在输出行的末尾有额外的空格。编辑:我没有看到输入行以空格结尾。抱歉。很好!还有
[-z“$line”]&&echo | echo-n“$line”
会的。谢谢你的解释。谢谢你的解释。啊哼-
awk-v RS='$1=$1'文件
@EdMorton true!我几分钟前看到了你的答案,它比我的更精彩:)不知怎的,我发现有必要
打印
以重新处理内容。现在我看到
$1=$1
就足够了。很好!一般情况下,或者重新编译$0并打印它是
{$1=$1}1
来解释记录为空的情况,但这不适用于这种情况。@EdMorton如果大小重要,您可以缩短它,即使是一些
awk'$1=$1'RS=file
大小通常也不重要,正如我可能已经提到过一次或两次的那样,在文件名列表中的脚本之后设置变量用于更改文件之间的值s、 否则,使用
-v
将它们设置在脚本的前面会更清晰、更不容易出错。啊哼-
awk-v RS='$1=$1'文件
@EdMorton true!我几分钟前看到了你的答案,它比我的更精彩:)不知怎的,我发现有必要
打印
以重新处理内容。现在我看到
$1=$1
就足够了。很好!一般情况下,或者重新编译$0并打印它是
{$1=$1}1
来解释记录为空的情况,但这不适用于这种情况。@EdMorton如果大小重要,您可以缩短它,即使是一些
awk'$1=$1'RS=file
大小通常也不重要,正如我可能已经提到过一次或两次的那样,在文件名列表中的脚本之后设置变量用于更改文件之间的值s、 否则,使用
-v
将它们设置在脚本的前面会更清晰、更不容易出错。