awk单列到多列

时间:2015-08-19 18:20:26

标签: awk grep multiple-columns

我的输入文件如下所示,

0   1.0069770730517629     
0   1.0068122761874614     
0   1.0004297763706849     
1   1.0069220626905635     
1   1.0079998216945956     
1   1.0006092898635817     
2   1.0071274842017928    
2   1.0083750686808803     
2   1.0006868227863552     
3   1.0073693844413083     
3   1.0086546525825624     
3   1.0007234442925264   

我希望输出文件看起来像这样,

0   1.0069770730517629     1.0068122761874614     1.0004297763706849     
1   1.0069220626905635     1.0079998216945956     1.0006092898635817     
2   1.0071274842017928     1.0083750686808803     1.0006868227863552     
3   1.0073693844413083     1.0086546525825624     1.0007234442925264 

我想使用grep或awk将单列拆分为多列。 任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

由于您特别声明“组合3行”:

paste - - - < file | awk -v OFS="    " '{print $1, $2, $4, $6}'

我将假设该文件已经排序。

另一种观点:只是awk,并没有关于sorted-ness的假设

gawk -v OFS="    " '
    {values[$1] = values[$1] OFS $2} 
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (key in values) print key values[key]
    }
' file

答案 1 :(得分:1)

使用具有相同awk结尾的pr的另一种替代方法

pr -3at file | awk -v OFS="\t" '{print $1,$2,$4,$6}'

使用了制表符分隔符而不是空格。

答案 2 :(得分:1)

这适用于(在bash和zsh中):

printf "%s %s%.s %s%.s %s\n" $(< file)

或者更便携,因为printf和cat几乎无处不在。 (我不认为这符合useless "use of cat" award的条件,或者我希望如此:)

printf "%s %s%.s %s%.s %s\n" $(cat  file)

仅限iff:

  • 订购文件,所有第一列值合在一起,

  • 正好要打印3个值。

需要a trick的printf到avoid printing some fields,或者使用更准确的措辞:&#34;从字符串中打印0个字符&#34;:&#34;%。s&#34;。< / p>

赛勒斯的最初想法是:printf "%s %s %s %s %s %s\n" $(< file)

答案 3 :(得分:1)

这个答案不会对要打印的值的数量做出任何假设,也不会假定文件是有序的。

#!/bin/bash

sort -n "file.csv" > "file.csv.tmp"

awk -v lastline="false" '{
    if (lastline != $1)
    {
        if (NR>1) { printf "\n"};
        {printf "%s   %s", $1, $2; lastline=$1; next};
    }
    else { printf "   %s", $2};

} END { printf "\n"}' "file.csv.tmp" #>"file.csv"

此程序首先对文件进行排序,以确保$1的所有值都在一起。

然后lastline的值用于控制动作 变量lastline最初设置为false,以确保其不匹配$1值 如果lastline不是重复(与$1不匹配),则会打印$1$2的值。 ... lastline已更新为此$1值 如果lastline是重复(等于$1),则只会打印$2 为了使格式正确,每个“新”$1行都会打印一个换行符。 ......最后。

如果需要替换原始的“file.csv”,请删除注释字符(#)以允许最后一行中的重定向。

将循环更改为if ... else 也许这样更具可读性。

相关问题