Shell
複製粘貼後如何解決文本文件中列的對齊問題?
我將文件 1 中的第 7,8 列和第 9 列複製到文件 2 中的第 7,8 列和第 9 列中,生成了一個新文件 3。生成的文件(文件 3)未與原始文件對齊,如何編輯它以保留結盟 ?
我使用了命令:
awk '(getline line < "file 1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file 2 > file 3
文件 1:
GRM in vacuum 192700 1GRM C1 1 17.188 0.311 13.994 -0.5971 0.0204 -0.0724 1GRM C2 2 0.094 0.383 0.005 0.4831 -0.8709 -0.2204 1GRM C3 3 0.091 0.524 0.008 -0.7098 0.3449 -0.3952
文件 2:
GRM in vacuum 192760 1GRM C1 1 0.061 0.071 14.000 1GRM C2 2 0.184 0.142 14.000 1GRM C3 3 0.184 0.284 0.000
文件 3(輸出):
GRM in vacuum 192760 1GRM C1 1 0.061 0.071 14.000 -0.5971 0.0204 -0.0724 1GRM C2 2 0.184 0.142 14.000 0.4831 -0.8709 -0.2204 1GRM C3 3 0.184 0.284 0.000 -0.7098 0.3449 -0.3952
為了解決我使用的對齊問題:
awk 'BEGIN{fmt="%10s%9s%7d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3
但我仍然有兩個問題。
第一個問題是輸出文件中列的對齊方式與原始文件(文件 1 和文件 2)不同。
第二個問題發生在第 10002 行,第 2 列和第 3 列結合在一起,導致輸出文件中從第 10002 行到最後消失的完整列,以下是第 10002 行的 3 個文件:
文件 1:
2500GRM C3 9999 15.716 8.242 0.002 0.2372 -0.2989 -0.0758 # line 10001 2500GRM C410000 15.592 8.311 0.003 0.2603 -0.2492 -0.2394 # line 10002 2501GRM C110001 15.591 8.453 0.006 0.0887 -0.2458 -0.7014 # line 10003 2501GRM C210002 15.714 8.524 0.007 -0.0788 0.0598 -0.9619 # line 10004
文件 2:
2500GRM C3 9999 15.433 8.378 0.000 # line 10001 2500GRM C410000 15.310 8.449 0.000 # line 10002 2501GRM C110001 15.310 8.591 0.000 # line 10003 2501GRM C210002 15.433 8.662 0.000 # line 10004
文件 3:
2500GRM C3 9999 15.433 8.378 0.000 0.2372 -0.2989 -0.0758 # line 10001 2500GRM C410000 15.310 8.449 0.000 -0.2492 -0.2394 # line 10002 2501GRM C110001 15.310 8.591 0.000 -0.2458 -0.7014 # line 10003 2501GRM C210002 15.433 8.662 0.000 0.0598 -0.9619 # line 10004
我已在以下連結中附加了所有文件:
https://drive.google.com/drive/folders/13diMVxlp-T9BXE_jnm_LL1jUPbz8eren
問題是您有 8 或 9 個數據欄位
file1
和 5 或 6 個數據欄位file2
。要麼C3 9999
是一個格式錯誤的欄位,要麼C410000
應該是兩個欄位C4
和10000
.要根據欄位數調整格式,您可以
- 使用兩個格式字元串並在它們之間切換
- 分割線時保存數組元素的數量
n
並取最後三個值a[n-2]
,,a[n-1]``a[n]
awk ' BEGIN{ fmt1="%8s %6s%5s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS fmt2="%8s %11s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS } (getline line < "file 1") > -1{ n=split(line, a) } NF<=3{ print; next } # print original line NF==6{ printf fmt1, $1, $2, $3, $4, $5, $6, a[n-2], a[n-1], a[n]; next } # 6 + 3 fields { printf fmt2, $1, $2, $3, $4, $5, a[n-2], a[n-1], a[n] } # 5 + 3 fields ' "file 2" > "file 3"
輸出:
... 2500GRM C3 9999 15.433 8.378 0.000 0.2372 -0.2989 -0.0758 2500GRM C410000 15.310 8.449 0.000 0.2603 -0.2492 -0.2394 2501GRM C110001 15.310 8.591 0.000 0.0887 -0.2458 -0.7014 2501GRM C210002 15.433 8.662 0.000 -0.0788 0.0598 -0.9619 ...