2017-05-26 19 views
0

與我以前的question相關。來自同一個流的列的連接

從具有列的流。

貓文件

a d 1 4 
b e 2 5 
c f 3 6 

如何列/字段串連成列,例如喜歡這個。

a 1 
b 2 
c 3 
d 4 
e 5 
f 6 

我曾嘗試使用我的優選命令cut如以下所示,但是隻有從第一cut命令的輸出。

cat file | (cut -f1,3; cut -f2,4;)

cat file | { cut -f1,3; cut -f2,4; }

a 1 
b 2 
c 3 
+0

'awk'{print $ 1,$ 3}'file ; awk'{print $ 2,$ 4}'文件' – Cyrus

回答

2

使用awk的,你可以做

awk '{for(i=1;i<=NF-2;i++)a[$i]=$(i+2)}END{for(i in a)print i,a[i]}' test 

a 1 
b 2 
c 3 
d 4 
e 5 
f 6 

所以鍵保存到一個關聯數組和明年後分配領域它。

注意這不會保留順序,但它只是巧合。

而且你原來的

cat file | (cut -f1,3; cut -f2,4;) 

不起作用,因爲第一次切割消耗流,而不會繼續第二。

你可以做類似

<file tee >(cut -f2,4) >(cut -f1,3) >/dev/null 

這將流發送到兩個命令。

0

cat file | =無用的貓;可以使用< file代替

cut -f1,3 <file 
cut -f2,4 <file 

但是從性能的角度來看,它啓動2個進程,打開文件兩次,並讀取兩次,這可以用內建命令來完成

str= 
while read k1 k2 v1 v2; do 
    echo "$k1"$'\t'"$v1" 
    str=$str$k2$'\t'$v2$'\n' 
done < file 
echo -n "$str" 

編輯:因業績不佳對於大文件,最好使用像awk,sed或更完整的perl這樣的文本處理工具,這裏是一行代碼:

perl -a -pe '$_="$F[0]\t$F[2]\n";$s.="$F[1]\t$F[3]\n";END{print$s}' <file 
+0

'while' /'read'循環很慢,除非你有一個*非常*小的文件,否則不會因啓動專用進程而獲得任何東西。 – chepner

+0

我同意,但它取決於循環中做了什麼這裏我只使用簡單的可變擴展和回聲內置如果進程擴展或子外殼被稱爲它將是最糟糕的 –

+0

閱讀*單獨*是較慢。你可以有一個空的循環體,它會比'cat'慢。 – chepner

相關問題