![行を列に適切な形式で転置する](https://rvso.com/image/164728/%E8%A1%8C%E3%82%92%E5%88%97%E3%81%AB%E9%81%A9%E5%88%87%E3%81%AA%E5%BD%A2%E5%BC%8F%E3%81%A7%E8%BB%A2%E7%BD%AE%E3%81%99%E3%82%8B.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
シェルスクリプトでは以下を使用しました
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
指示実際には、出力として期待するものに非常に近いですが、スペースのためにヘッダーを別の行に分割します(入力ファイルがタブまたは他のもので区切られている場合は問題になりません)。とにかく、ヘッダーが最後の行にどのように印刷されるのかわかりませんでした。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