awk单列到多列

awk单列到多列,awk,grep,multiple-columns,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.0006868227

我的输入文件如下所示

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 
我希望输出文件如下所示

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将单个列拆分为多个列。
有人能帮我吗?

因为你特别说明了三行:

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

由于您特别说明了合并3行:

paste - - - < file | awk -v OFS="    " '{print $1, $2, $4, $6}'
另一种选择是使用具有相同awk结尾的pr

pr -3at file | awk -v OFS="\t" '{print $1,$2,$4,$6}'
使用制表符分隔符而不是空格。

另一种选择是使用具有相同awk结尾的pr

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

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

这适用于bash和zsh:

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

该文件已排序,所有第一列值一起排列,并且

要打印的值正好有3个

需要printf或使用更精确的措辞:从字符串打印0个字符:%.s


Cyrus的原始想法是:printf%s%s%s%s%s\n$这在bash和zsh中适用:

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

该文件已排序,所有第一列值一起排列,并且

要打印的值正好有3个

需要printf或使用更精确的措辞:从字符串打印0个字符:%.s


Cyrus的原始想法是:printf%s%s%s%s%s\n$此答案不假设要打印的值的数量,也不假设文件已排序

#!/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的值来控制操作。 var lastline最初设置为false,以确保它不匹配$1值。 如果lastline不是repeat,但与$1不匹配,则打印$1和$2的值。。。最后一行更新为这个$1值。 如果lastline是等于$1的重复,则只打印$2。 为了使格式正确,每个新的$1行都会打印一个换行符。。。最后

如果需要替换原始文件.csv,请删除注释字符以允许在最后一行中重定向

将循环更改为if…else。
可能更容易阅读。

此答案不假设要打印的值的数量,也不假设文件已排序

#!/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的值来控制操作。 var lastline最初设置为false,以确保它不匹配$1值。 如果lastline不是repeat,但与$1不匹配,则打印$1和$2的值。。。最后一行更新为这个$1值。 如果lastline是等于$1的重复,则只打印$2。 为了使格式正确,每个新的$1行都会打印一个换行符。。。最后

如果需要替换原始文件.csv,请删除注释字符以允许在最后一行中重定向

将循环更改为if…else。
可能更容易阅读。

您想将每3行合并为一行,还是将每一行以相同数字开头合并为一行?我想将每3行以相同数字开头合并为一行。如果4行以相同数字开头呢?你会合并前3个,保持第4个不变,然后开始下一批还是做其他事情?顺便说一句,grep是一个在文件中搜索regexp并打印匹配行g/re/p get it?的工具?。我不知道这个awk代码是如何工作的,但我可以使用:Try this:awk's!=$1 | | NR==1{s=$1;ifp{print p};p=$0;next}{sub$1,,$0;p=p$0;}END{print p}'file | column-t我相信有人可以优化awk代码以摆脱column-t。您想将每3行合并为一行还是将每一行以相同数字开头合并为一行?我想将每3行以相同数字开头合并为一行。如果4行以相同数字开头呢?你会合并前3个,保持第4个不变,然后开始下一批还是做其他事情?顺便说一句,grep是一个在文件中搜索regexp并打印匹配行g/re/p get it?的工具?。我不知道这个awk代码是如何工作的,但我可以使用:Try this:awk's!=$1 | | NR==1{s=$1;ifp{print p};p=$0;next}{sub$1,,$0;p=p$0;}END{print p}file | column-t我相信有人可以优化awk代码以摆脱column-t.paste,好主意!另一种可能性:printf%s%s%s%s%s%s\n$