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$
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$