簡體   English   中英

根據條件分割linux文件

[英]Split linux files based on condition

我在linux有一個文件。 該文件的內容如下。

Test_12
Test_abc
start_1
start_abcd
end_123
end_abcde_12

現在,我想根據第一個underscore之后的匹配字符串將文件拆分為多個小文件

輸出繼電器:

  • Test.txt:

     Test_12 Test_abc 
  • start.txt:

     start_1 start_abcd 
  • end.txt:

     end_123 end_abcde_12 

我已經嘗試過如下

while read -r line ; do
    echo "$line" >> "${line}.txt"  
done < split.txt

但是我每一行都有文件。

我在這里做錯什么,如何獲得所需的輸出?

最好使用awk:

awk -F_ 'p && $1 != p{close(fn)} {p=$1; fn=p ".txt"; print>>fn} END{close(fn)}' split.txt

當第一列的值更改時,關閉文件的操作很少,因此如果您輸入的文件很大,打開的文件就不會太多。

您需要修剪每行的下划線和尾隨文本。 %%_*這樣做:

while read -r line ; do
    echo "$line" >> "${line%%_*}.txt"  
done < split.txt

說明:

  • % :修剪尾隨文本
  • %% :找到最長的匹配項
  • _* :下划線以及之后的所有內容

閱讀為什么使用殼循環處理文本認為不好的做法 ,然后僅使用awk。

使用GNU awk,您需要做的是:

awk -F'_' '{print > ($1".txt")}' file

否則,由於其他問題,如果您的輸入文件按第一個字段分組(如您的問題所示),那么您所需要做的就是:

awk -F'_' '{f=$1".txt"; print > f} f!=p{close(p); p=f}' file

如果不是,則效率會稍低,因為您可能需要重新打開以前關閉的文件(因此,用>>而不是> ):

awk -F'_' '{f=$1".txt"; print >> f} f!=p{close(p); p=f}' file

你可以嘗試一下:

while read line; do
    content=`echo $line|awk 'BEGIN{FS="_"}{print $1}'`
    for f in *; do
        filename=`echo $f|awk 'BEGIN{FS="."}{print $1}'`
        if [ "$content" == "$filename" ]; then
            echo $line>>$f
            break
        else
            echo $line>>$content.txt
            break
        fi
    done
done< file.txt

輸出:

bash-4.4$ ls -lrt
total 12
-rw-r--r-- 1 21726 21726 978 Sep 22 04:54 README.txt
-rw-r--r-- 1 21726 21726  49 Sep 22 04:56 file.txt
-rwxr-xr-x 1 21726 21726 252 Sep 22 05:06 script.sh
bash-4.4$ cat file.txt
Test_12
Test_abc
Start_1
Start_abc
end_1
end_abc
bash-4.4$ ./script.sh
bash-4.4$ ls -lrt
total 24
-rw-r--r-- 1 21726 21726 978 Sep 22 04:54 README.txt
-rw-r--r-- 1 21726 21726  49 Sep 22 04:56 file.txt
-rwxr-xr-x 1 21726 21726 252 Sep 22 05:06 script.sh
-rw-r--r-- 1 21726 21726  17 Sep 22 05:06 Test.txt
-rw-r--r-- 1 21726 21726  18 Sep 22 05:06 Start.txt
-rw-r--r-- 1 21726 21726  14 Sep 22 05:06 end.txt
bash-4.4$ cat Start.txt
Start_1
Start_abc
bash-4.4$ cat Test.txt
Test_12
Test_abc
bash-4.4$ cat end.txt
end_1
end_abc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM