[英]awk single column to 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將單列拆分為多個列。 有人可以幫助我嗎?
由於您明確指出“合並3行”:
paste - - - < file | awk -v OFS=" " '{print $1, $2, $4, $6}'
我將假設該文件已經排序。
另一個建議:只是awk,而沒有關於排序度的假設
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
另一種使用pr
且結尾相同的pr
選項
pr -3at file | awk -v OFS="\t" '{print $1,$2,$4,$6}'
使用制表符分隔符代替空格。
這有效(在bash和zsh中):
printf "%s %s%.s %s%.s %s\n" $(< file)
或更便攜,因為printf和cat幾乎隨處可見。 (我認為這不符合無用的“貓的使用”獎 ,所以我希望:)
printf "%s %s%.s %s%.s %s\n" $(cat file)
僅當:
該文件是有序的,所有第一列的值都在一起,並且
恰好有3個值要打印。
需要使用 printf 技巧來避免打印某些字段 ,或者使用更精確的措辭:“從字符串中打印0個字符”:“%。s”。
Cyrus的原始想法是: printf "%s %s %s %s %s %s\\n" $(< file)
該答案不對要打印的值數量做任何假設,也不假設文件已排序。
#!/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
不是重復(不匹配$1
),則將打印$1
和$2
的值。 ...並且最后lastline
已更新為該$1
值。
如果lastline
是重復的(等於$1
),則僅打印$2
。
為了使格式正確,每行“ $1
”都打印了一個換行符。 ...最后。
如果需要替換原始的“ file.csv”,請刪除注釋字符(#)以允許在最后一行中進行重定向。
將循環更改為if ... else。
也許這樣更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.