Command-Line

命令行 - 有條件地保存子字元串

  • May 14, 2022

命令行實用程序可以有條件地將子字元串保存在不同的文件中嗎?我有一個文件 ( file.txt),其中包含如下幾行。

1/1_ABCD4.txt:20020711
1/1_ABCD10.txt:20020731
2/2_ABCD2.txt:20071103
2/2_ABCD5.txt:20071107
3/3_ABCD1.txt:20090225
3/3_ABCD3.txt:20090230

我的目標是與文件、文件和 文件20020711一起保存?20020731``1``20071103``20071107``2``20090225``20090230``3

我可以使用以下命令提取所需的子字元串:,但這樣做會失去參考數字:

$ grep -oP 'txt\:\K[A-Z0-9-]+' 'path/to/file.txt'

20020711
20020731
20071103
20071107
20090225
20090230

/是否可以在使用命令行時使用前面的第一個數字建構三個單獨的文件作為目標參考?目標可能是與原始文本文件相同的目錄。

  1. 文件:
20020711
20020731
  1. 文件:
20071103
20071107
  1. 文件:
20090225
20090230

謝謝你。

awk

awk -F'[:/]' '{print $NF > $1}' file

我們使用/:作為分隔符來分割行。最後一個欄位 ( $NF) 是要列印的內容,第一個欄位 ( $1) 是輸出文件名。


為您的測試輸入文件執行後:

$ head 1 2 3
==> 1 <==
20020711
20020731

==> 2 <==
20071103
20071107

==> 3 <==
20090225
20090230

此外,根據您的數據,最好在此操作之前添加一個條件,以避免列印到具有隨機名稱的文件,如果我們有更多具有不同結構的行,輸入可能會很危險。

一個簡單的例子,如果我們只想在第一個欄位(文件名)只有數字時列印:

awk -F'[:/]' '$1 ~ /^[0-9]+$/ {print $NF > $1}' file

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