![將行轉列為正確的格式](https://rvso.com/image/164728/%E5%B0%87%E8%A1%8C%E8%BD%89%E5%88%97%E7%82%BA%E6%AD%A3%E7%A2%BA%E7%9A%84%E6%A0%BC%E5%BC%8F.png)
我有 3 個文字文件emp id.txt,之前為 sal.txt,現在為 sal.txt。這 3 個文件的內容:-
員工 ID.txt
emp id ----- 1 4 7 10 13 16 19
在 sal.txt 之前
before sal ----- 23 56 78 97 105 123 145
現在薩爾
now sal ---- 25 60 82 99 109 124 150
我在 shell 腳本中使用了下面的內容
awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } END{ for (i in RtoC) print RtoC[i] }'
從行轉換為列然後我得到類似的輸出 -
1 23 25
4 56 60
7 78 82
10 97 99
13 105 109
16 123 124
19 145 150
emp before now
id sal sal
--- ----- ----
但我想要以下格式的輸出,例如-
--------------------------------
|emp id |before sal | now sal |
|--------|---------- | --------|
|1 | 23 | 25 |
|4 | 56 | 60 |
|7 | 78 | 82 |
|10 | 97 | 99 |
|13 | 105 | 109 |
|16 | 123 | 124 |
|19 | 145 | 150 |
--------------------------------
您能否幫我解決這個問題,以便我能夠獲得上述格式的輸出。
答案1
step1:
for i in "emp_id.txt" "beforesal.txt" "nowsal.txt"; do perl -pne "s/ /\n/g" $i >> "$i"fi; done
step2:
paste emp_id.txtfi beforesal.txtfi nowsal.txtfi
輸出
emp before now
id sal sal
----- ----- ----
1 23 25
4 56 60
7 78 82
10 97 99
13 105 109
16 123 124
19 145 150
答案2
定義一個將檔案轉換為列的小函數:
f2c() { tr -s '[:blank:]' '\n' < "$1"; }
然後使用paste
將列縫合在一起,流程替代作為要貼上的文件參數,以及column
漂亮的輸出。
paste <(f2c 'emp id.txt') <(f2c 'before sal.txt') <(f2c 'now sal.txt') | column -t
emp before now
id sal sal
----- ----- ----
1 23 25
4 56 60
7 78 82
10 97 99
13 105 109
16 123 124
19 145 150
答案3
給定awk
命令實際上非常接近您期望的輸出,但是由於空格而將標頭分成單獨的行(如果您的輸入文件用 Tab 或其他東西分隔,這不會成為問題),無論如何我不明白標頭如何將在最後一行列印,可能會有所不同awk
版本有不同的排序選項為預設;例如,PROCINFO["sorted_in"]="@val_num_desc"
您的輸出將類似於以下內容(但仍然不知道數字如何在您的預期結果中按升序排序):
19 145 150
16 123 124
13 105 109
10 97 99
7 78 82
4 56 60
1 23 25
id sal sal
emp before now
----- ----- ----
讓我們嘗試使用下面修改後的命令,看看這是否是您需要的或接近您真正期望的東西:
awk '{ $2=$1"_"$2; $1="";
for (i=2; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] "\t" $i: $i) }
END{ PROCINFO["sorted_in"]="@unsorted";
for (i in RtoC) print RtoC[i];
}' emp.txt before.txt new.txt |column -t
輸出:
emp_id before_sal now_sal
----- ----- ----
1 23 25
4 56 60
7 78 82
10 97 99
13 105 109
16 123 124
19 145 150