到目前为止,我只是在阅读,但现在我必须开始回答一个复杂的问题。我疯狂地在谷歌上搜索,但找不到答案,答案一定是在 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
- 从示例中可以看出,键不是唯一的,可能会根据上述键将多个值合并为一个。注意:我更希望此文件不带输出所需的“.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
目录中。运行脚本只有一次否则您将在结果文件中得到重复的条目。
要创建和使用脚本文件,请按照以下步骤操作:
通过在终端中运行以下命令,在父目录中创建并编辑脚本文件(
cd
先到目录):nano my_script.sh
将以下代码复制并粘贴到编辑器中:
#!/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"
保存脚本文件并按Ctrl+X然后按退出编辑器Y。
通过在终端中运行以下命令使脚本文件可执行:
chmod +x my_script.sh
通过在终端中运行以下命令来运行脚本:
bash my_script.sh
完毕
祝你好运