Text-Processing

將一個文件中的一列作為最後一列添加到另一個文件

  • April 22, 2022

我想創建一個循環,其中來自文本文件的特定列(在我的情況下為第 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

引用自:https://unix.stackexchange.com/questions/699726