Text-Processing
將一個文件中的一列作為最後一列添加到另一個文件
我想創建一個循環,其中來自文本文件的特定列(在我的情況下為第 4 列)作為最後一列添加到新文本文件中。我總共有大約 500 個文本文件 (V1-V500),我想從中獲取第四列並將其添加到新的文本文件(由製表符分隔的列)。所有文本文件都有相同的行數。此外,添加的列的標題應包含最初來自的文本文件的文件名。我已經嘗試使用 awk 和 for 循環來製定命令行,但我的命令都不起作用。我已經根據上一篇文章的命令行嘗試了命令行。我正在使用可用的 GNU 工具在 Linux 中工作。
舉個例子:V1 文本文件
header1 header2 header3 header4 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
V2 文本文件:
header1 header2 header3 header4 17 25 21 29 18 26 22 30 19 27 23 31 20 28 24 32
新文本文件:
V1 V2 13 29 14 30 15 31 16 32
謝謝你的幫助!
awk
解析所有文件。awk -F'\t' -v OFS='\t' '{ x = (FNR==1 ? FILENAME : $4) a[FNR] = (FNR==NR ? x : a[FNR] OFS x) } END { for (i=1;i<=FNR;i++) print a[i] }' V{1..500}
x
是我們從每條生產線上保留的東西,a
也是我們建造的新生產線。兩者都是使用條件表達式分配的。FNR
是目前輸入文件的行號,NR
一共。FNR==NR
意思是“在解析第一個文件時”。我還假設了製表符分隔的輸入和輸出。
非 awk 解決方案:
#!/bin/bash for num in {1..500}; do echo V$num > temp_$num #put the filename as header < V$num tail -n+2 | cut -f4 >> temp_$num #get the contents of column 4 if [[ -f V_new ]]; then #if not first iteration paste V_new temp_$num > temp #combine previous files with current file mv temp V_new else # if first iteration mv temp_$num V_new fi done