使用 awk 重新格式化表

使用 awk 重新格式化表

我必须重新格式化许多很长的表格,如下所示

原始格式:

John Smith,Jones,Taylor
Janet Williams,Brown,Wilson

所需格式:

John Smith
John Jones
John Taylor
Janet Williams
Janet Brown
Janet Wilson

我怎样才能这样做呢?

答案1

awk

awk -F"[ ,]" '{for(i=2;i<=NF;i++){print $1,$i;}}' file
  • -F"[ ,]": 分隔符设置为空格和逗号。现在我们在$1名字中添加了姓氏,在$2最后一个字段中添加了姓氏。
  • for(i=2;i<=NF;i++):循环遍历每个字段,从字段 2 开始。
    • print $1,$i;:打印名字,然后打印姓氏。

输出:

John Smith
John Jones
John Taylor
Janet Williams
Janet Brown
Janet Wilson

答案2

尝试

awk ' { n=split($2,A,",") ;
    for (i=1;i<=n;i++) printf "%s %s\n",$1,A[i] ;
} ' file

在哪里

  • split($2,A,",")将用逗号 (,) 分割第二个字段,
  • n= 会算
  • for( )将循环
  • A[i]是当前姓名(或姓氏)
  • printf "%s %s\n",$1,A[i]一起打印。

答案3

sed:

sed ':1;s/,/\n/;T;P;s/\S*\n//;t1' file
  • :1标记返回点
  • s/,/\n/ sn用ewline 替换第一个逗号
  • T如果替换未执行(行中没有更多逗号)传递到脚本末尾
  • P打印从头到尾的n
  • s/\S*\n//用ewline 删除单词(\S*任何非空符号)n
  • t1如果替换成功——返回1

或者更多POSIX'ly

sed ':1;s/,/\n/;/\n/P;s/\S*\n//;t1' file

相关内容