Text-Processing

根據其他列的值過濾列

  • October 17, 2016

我有一個包含兩列和超過 3,00,000 行的文本文件。格式如下

Filename1.txt Num1
Filename2.txt Num2
Filename3.txt Num3

我想將對應Numx大於 50 且小於 200 的所有文件名複製到不同的文件中。

一旦我將這些文件名複製到不同的文件中,我想將所有這些文件複製到不同的文件夾中。

我怎麼做?

如果您願意,可以同時進行比較和複製awk

awk '$2>50 && $2<200 {system("cp -- "$1" /path/to/destination/")}' file.txt

假設您要將文件複製到destination目錄,請更改它以滿足您的需要。

  • $2>50 && $2<200進行所需的比較
  • 如果匹配,則cp執行操作 ( {system("cp -- "$1" /path/to/destination/")}),由以下system()函式完成awk

讓我們考慮這個測試文件:

$ cat file
Filename1.txt 49
Filename2.txt 72
Filename3.txt 189
Filename4.txt 203

要僅選擇第二列大於或等於 50 且小於或等於 200 的文件:

$ awk '$2>=50 && $2<=200 { print $1}' file
Filename2.txt
Filename3.txt

要將這些文件名放在某個路徑的新文件中:

awk '$2>=50 && $2<=200 { print $1}' file >/path/to/newfile

複製選定的文件

假設數字是整數,請嘗試:

while read fname num; do [ "$num" -ge 50 ] && [ "$num" -le 200 ] && cp -- "$fname" /some/path/ ; done <file

或者,對於那些喜歡將程式碼分佈在多行中的人:

while read fname num
do
  [ "$num" -ge 50 ] && [ "$num" -le 200 ] && cp -- "$fname" /some/path/
done <file

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