[英]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要求Section
和flag
字符串之间的所有内容,因此以下内容可能会有所帮助。
awk '/Age/ && flag{sub(/,/,"");print val1 $0;val1=flag="";next} /Section/{val1=$0;flag=1;next} flag{val1=val1 $0;}' Input_file
如果要在字符串section
和flag
之间保留所有内容,并且我们必须确保每个组都应在其中包含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.