在模式下使用awk拆分文件

时间:2015-05-05 11:11:30

标签: linux awk

以下是example.tsv中连续数据的示例:

somedata1:data1#||#somedata2:data2#||#somedata1:data3#||#somedata2:data4

我想做两件事:

  1. 从模式'#||#'中拆分数据并将其写入其他文件。拆分后的列数不固定。 我尝试过awk命令:

    awk -F"#\|\|#" '{print;}' example.tsv > splitted.tsv

    第一个文件的输出应为:

    column 1 somedata1:data1 somedata2:data2 somedata1:data3 somedata2:data4

  2. 接下来,我想根据':' 拆分splitted.tsv中的数据。

    somedata1 data1 data3 并将其写入文件。 有没有办法在一个awk命令中执行此操作?

2 个答案:

答案 0 :(得分:4)

您需要正确转义|。然后使用split

awk -F'#\\|\\|#' '{split($2,a,":");print a[2]}' file
data2

要在表格中打印所有数据:

awk -F'#\\|\\|#' '{for (i=1;i<=NF;i++) print $i}' file
somedata:data1
somedata:data2
somedata:data3
somedata:data1

要进一步拆分数据:

awk -F'#\\|\\|#' '{for (i=1;i<=NF;i++) {split($i,a,":");print a[1],a[2]}}' file
somedata data1
somedata data2
somedata data3
somedata data1

答案 1 :(得分:0)

对于第一次拆分,您可以尝试

$ awk 'BEGIN{print "column1"}{gsub(/#\|\|#/,"\n"); print }' file 
column1
somedata:data1
somedata:data2
somedata:data3
somedata:data1

然后拆分:,你可以这样做:

$ awk -F: 'BEGIN{print "column1","column2"}
                {gsub(/#\|\|#/,"\n"); gsub(/:/," ");print }' file
column1 column2
somedata data1
somedata data2
somedata data3
somedata data1