繁体   English   中英

使用sed或awk格式化数据

[英]Format Data using sed or awk

我在文件中具有以下格式的数据

Section : A1234,
Name : ABCBDEDF,
Medium : English ,
Age : No,   
Name : Reporting,
Age : No
Section : XYSZA,
Name : Work,
Age : YES   

我正在尝试以以下格式获取数据:-

Section : A1234,Name : ABCBDEDF,Age : No
Section : A1234,Name : Reporting,Age : No
Section : XYSZA,Name : Work,Age : YES

我尝试了一些sed和awk语句,但是我只能将所有行合并在一起。

awk '{key=$0; getline; print key "" $0;}' test.txt

任何帮助表示赞赏。

跟随awk可能会帮助您。

awk '/Section/{val1=$0;next} /Name/{val2=$0;next} /Age/{sub(/,/,"");print val1 val2 $0;}'   Input_file

编辑:由于OP告诉OP要求Sectionflag字符串之间的所有内容,因此以下内容可能会有所帮助。

awk '/Age/ && flag{sub(/,/,"");print val1  $0;val1=flag="";next} /Section/{val1=$0;flag=1;next} flag{val1=val1  $0;}'  Input_file

如果要在字符串sectionflag之间保留所有内容,并且我们必须确保每个组都应在其中包含section ,否则它将不会打印出来。

用bash:

while IFS=" ," read -r x foo y; do 
  [[ $x == "Section" ]] && s="$y"
  [[ $x == "Name" ]] && n="$y"
  [[ $x == "Age" ]] && a="$y" && echo "Section : $s,Name : $n,Age : $a"
done < file

输出:

Section : A1234,Name : ABCBDEDF,Age : No
Section : A1234,Name : Reporting,Age : No
Section : XYSZA,Name : Work,Age : YES

根据我认为最可能的输入格式,一个部分后面可以有多个名称/年龄对。

如果是这种情况,那么您只需要存储最后看到的部分,并输出名称和年龄即可。

我们可以只存储最近看到的部分和名称,并随年龄一起使用。 这也将允许您跳过输入文件中的名称,但是如果它们存在,它将不会起作用。

这意味着这应该可以解决问题:

awk  '/^Section/{sec=$0}/^Name/{nm=$0}/^Age/{print sec""nm""$0}'

以下记录显示了它的作用:

printf 'Section : A1234,\nName : ABCBDEDF,\nAge : No,\nName : Reporting,\nAge : No\nSection : XYSZA,\nName : Work,\nAge : YES\n' | awk  '/^Section/{sec=$0}/^Name/{nm=$0}/^Age/{print sec""nm""$0}'

根据您的要求输出:

Section : A1234,Name : ABCBDEDF,Age : No,
Section : A1234,Name : Reporting,Age : No
Section : XYSZA,Name : Work,Age : YES

请注意,第一行的末尾有一个逗号,这是由于输入数据中存在逗号引起的。 如果您希望将其删除,则会在代码中增加另一个小的复杂性。 现在,我只是假设您的输入数据不正确,或者您希望它原样回显。

我用您修改后的输入进行了尝试。 检查以下是否可行

awk '/^Section/{s=$0}
     /^Name/ && match(p,/^Age/){$0=sprintf("%s%s%s",s,ORS,$0)}
     {print;p=$0}' file_name | sed ':a;/Age/!{N;s/\n//g;ba}'

输出(Вывод)

Section : A1234,Name : ABCBDEDF,Medium : English ,Age : No,   
Section : A1234,Name : Reporting,Age : No
Section : XYSZA,Name : Work,Age : YES 

注意(Заметка)awk部分在此处进行了预处理,以在缺少的地方添加Section ,并且sed以要求的格式打印输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM