使用sed或awk格式化数据

时间:2018-01-11 05:39:10

标签: bash awk sed

我在文件中使用以下格式的数据

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

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

关注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,否则就不会打印它。

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

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

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

我们可以存储最近看到的部分和名称,并将其与每个年龄一起使用。这也允许你跳过输入文件中的名字,但如果它们在那里,它就不会有效。

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

val list: List[() => String] = List(foo1) //foo1 type mismatch.
val list: List[ => String] = List(foo1)   //Invalid syntax.

以下成绩单显示了它的实际效果:

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

请注意,第一行末尾有一个逗号,这是由输入数据中的一行引起的。如果你想要它被剥离,那将为代码添加另一个小的复杂性。现在,我只是假设您的输入数据不正确或者您希望它按原样回显。

答案 3 :(得分:1)

我已经尝试了修改后的输入。检查以下是否有效

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部分在此处执行预处理,在缺失的地方添加Sectionsed打印所需的输出格式。