我有一个master_log_file.txt,序列如下:
TransferDate|DeptID|FolderID |DocID |AFPFileName|NoOfAcct|
20181024 |1 |LRREM1.20181015.CGLOG|test |xxxx |12
20181024 |2 |LRREM2.20181013.CGLOG|home |XyyX |2
20181024 |3 |LRREM3.20181013.CGLOG|office|xy |5
20181024 |4 |LRREM4.20181013.CGLOG|store |yy |10
我想创建一个bash文件,根据FolderID和DeptID将所有日志数据分离到单独的日志文件中。有人可以给我一个关于如何执行此操作的示例,因为我不熟悉此批处理产品。提前致谢。 根据mjuarez的建议,下面是我的bash文件。
echo off
for folder in `grep -v TransferDate log_test.txt | cut -d "|" -f3 | sort | uniq`; do
grep ${folder} separated.txt > F:/Work/FLP Code/test/folder_${folder}.txt;
done
pause
我想念什么吗?
答案 0 :(得分:1)
首先,请参见this link展示您的尝试,并使其他人有时间值得您去做您的尽职调查。
第二:该格式是否一致?它显然是格式化的,所以我假设它是
。cut -c 14-41 logFile | grep -v DeptID | sort -u |
while read key
do IFS="$IFS|" read dept folder <<< "$key";
grep "$key" < logFile > $folder.$dept;
done
14-41是您提到的键的范围,我用cut
拉。
使用grep -v
和sort -u
将标题剥离,以获得定义每个输出文件的一组独特组合。通过管道将其传送到while读取循环。
为$ IFS的临时分配添加管道字符,以将部门和文件夹分配给var(我用来为输出创建不同的文件名),然后grep
将每个组合的键分配到相关文件。
您需要做什么吗?
我看到有人击败了我,但是我不认为文件夹值总是一致的,因为您分别提到了dept。
答案 1 :(得分:1)
就像您要求根据FolderID 和 DeptID分隔所有日志数据一样,您可以处理输入文件(我们称其为 /tmp/log_file.txt )这样:
#!/bin/bash
for key in $( cat /tmp/log_file.txt |sed -e 's/[ \t]//g;' |awk -F '|' '{print $2"_"$3}' |sort -u ); do
fileName="$key"
filter=$( echo "$key" |sed -e "s/\([^_]*\)_\(.*\)$/\1[ \t]*|\2/" )
grep -re "$filter" /tmp/log_file.txt > "/tmp/$fileName"
done
如果您需要进一步的说明,请不要犹豫。
答案 2 :(得分:0)
您基本上可以遍历要分类的唯一元素(在这种情况下,我使用了FolderID
列),并使用grep仅将这些记录发送到自己的文件中。
for folder in `grep -v TransferDate file.txt | cut -d "|" -f3 | sort | uniq`; do
grep ${folder} file.txt > /tmp/folder_${folder}.txt;
done
这将创建以下文件:
folder_LRREM1.20181015.CGLOG.txt folder_LRREM3.20181013.CGLOG.txt
folder_LRREM2.20181013.CGLOG.txt folder_LRREM4.20181013.CGLOG.txt
您可以更改循环中的首字母grep
,以完全使用所需的唯一字段或字段组合。
已更新:
这是已完成的脚本,其中考虑了两个字段,并为每个类别分别创建了文件:
for key in `cat file.txt | grep -v FolderID | awk 'BEGIN { FS="|"} { print $3 "_" $4 }' | sort | uniq` ; do
value1=`echo $key | cut -d_ -f1`
value2=`echo $key | cut -d_ -f2`
grep -E "${value1}.*\|${value2}" file.txt > /tmp/key_${key}.txt;
done
它的工作方式与第一个有所不同。它需要通过两个键进行grep操作,但是在循环中,它需要构建一个基本的正则表达式来查找与这两个值都匹配的行,然后将它们全部发送到以全键作为其名称一部分的文件中。