重要的:

重要的:

到目前为止,我只是在阅读,但现在我必须开始回答一个复杂的问题。我疯狂地在谷歌上搜索,但找不到答案,答案一定是在 BASH 中。(感谢 Perl 等想法,但不幸的是这不是一个选择。)

我有一个文本文件,其中的数据用 | 字符分隔,如下所示:

DETAIL||||||||||103|line1  
DETAIL||||||||||103|line2  
DETAIL||||||||||105|line3  
DETAIL||||||||||433|line4  
DETAIL||||||||||433|line5 

我设法使用以下命令根据第 11 个关键字段将其拆分为新文件:

cat extract_GL2_*.txt | grep DETAIL | awk -F\| '{print>>"SPLIT/"$11".txt"}'

这里有两个问题:
1. 我需要从另一个名为 Company.txt 的文件(放在 SPLIT 的父文件夹中)中分配名称,并且该名称的关键列的值如下(所以基本上我需要用有意义的东西替换数字):

公司.txt:

103|US100E1  
104|US100E1  
105|US100E1  
433|EMEAE1
  1. 从示例中可以看出,键不是唯一的,可能会根据上述键将多个值合并为一个。注意:我更希望此文件不带输出所需的“.txt”,但如果脚本更容易实现,我很乐意重新编写 Company.txt。

可以进行第二步,通过关键字查找文件名并进行合并,删除旧文件,但第一步“简单地”用第二个文件替换目标文件名会更优雅。两种方法我都失败了,但我对更简单/更快的方法很满意。

因此,拆分必须基于原始文件第 11 列的值和第二个文件的文件名。可以有更多源文件,它们必须附加,并且拆分文件可能包含多个关键字段,具体取决于文件名分配。

Company.txt 和 extract_GL2* 文件位于同一个文件夹中,拆分文件需要转到 SPLIT 子文件夹。

一些代码(我无法完成的部分只是伪的,但也无法测试其余部分):

#!/bin/bash  
while read line; do  
 company="${line|awk -F\| '{print $11}'}"  
 newfilename="${cat Company.txt | grep $company | awk -F\| '{print $2}' | head -1}" + ".txt"  
 _replace chr(34) to space in $line_  
 _replace ,  to space in $line_  
 _replace | to , in $line_  
 echo "$line" >> "SPLIT\$newfilename.txt"  
done < "extract_GL2_*.txt"  

非常感谢:塔马斯

答案1

将文件放在SPLIT目录的父目录中,并创建脚本文件按照以下步骤操作并调用它my_script.sh,这样该目录的结构将如下所示:

Company.txt
extract_GL2_1.txt
extract_GL2_23.txt
my_script.sh
SPLIT/

重要的:

  • 目录中的文件SPLIT将被创建和删除,不要将任何文件放在SPLIT目录中

  • 运行脚本只有一次否则您将在结果文件中得到重复的条目。


要创建和使用脚本文件,请按照以下步骤操作:

  1. 通过在终端中运行以下命令,在父目录中创建并编辑脚本文件cd先到目录)

    nano my_script.sh

  2. 将以下代码复制并粘贴到编辑器中:

#!/bin/bash

echo
echo "splitting files ..."
echo
cat extract_GL2*.txt |
        while read line
                do
                        echo "$line" | grep DETAIL | awk -F\| '{print >> "SPLIT/"$11".txt"}'
                done


echo "renaming splitted files ..."
echo
        while IFS='|' read f1 f2
                do
                        mv -n "SPLIT/$f1.txt" "SPLIT/$f2.txt" 2> /dev/null
                done < "Company.txt"


echo "combining splitted files ..."
echo
        while IFS='|' read f1 f2
                do
                        cat "SPLIT/$f1.txt" >> "SPLIT/$f2.txt" 2> /dev/null
                done < "Company.txt"

echo "cleaning up ..."
echo
        while IFS='|' read f1 f2
                do
                        rm "SPLIT/$f1.txt" 2> /dev/null
                done < "Company.txt"

  1. 保存脚本文件并按Ctrl+X然后按退出编辑器Y

  2. 通过在终端中运行以下命令使脚本文件可执行:

    chmod +x my_script.sh

  3. 通过在终端中运行以下命令来运行脚本:

    bash my_script.sh

完毕

祝你好运

相关内容