我的输入文件如下所示,
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将单列拆分为多列。 任何人都可以帮助我吗?
答案 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 也许这样更具可读性。