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

时间:2014-07-14 09:43:01

标签: 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  
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  

5 个答案:

答案 0 :(得分:3)

您可以将记录分隔符定义为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<=NF; i++) printf "%s%s", $i, (i==NF?ORS:FS)}' file

答案 1 :(得分:2)

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

引用man awk

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;}'

答案 2 :(得分:2)

在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

答案 3 :(得分:1)

如果你没有使用任何约束来使用awk,那么只需使用一个循环,逐行阅读就可以了:

while read -r line ; do 
  if [[ -z $line ]]; then echo ;  else echo -n $line;  fi 
done <file

答案 4 :(得分:1)

通过awk's 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