文件分类科

文件分类科

下面有一些示例数据(称为 test.txt)。我想通过搜索第 4 列的前两位数字将这个大文档拆分为 3 个文档。我对 Linux(Lubuntu 14.04)还不太熟悉,研究过“csplit”和“awk”,但似乎都搞不懂它们的语法。(我​​正在编写 BASH 脚本)

前:

测试.txt

12-1-2014   Allow   00:00:00 00:00:00
12-1-2014   Allow   00:00:00 00:00:00   
12-2-2014   Allow   01:00:00 01:00:00
12-10-2014  Deny    01:00:00 01:00:00
12-10-2014  Deny    02:00:00 02:00:00
12-11-2014  Deny    02:00:00 02:00:00

后:

测试1.txt

12-1-2014   Allow   00:00:00 00:00:00
12-1-2014   Allow   00:00:00 00:00:00

测试2.txt

12-2-2014   Allow   01:00:00 01:00:00
12-10-2014  Deny    01:00:00 01:00:00

测试3.txt

12-10-2014  Deny    02:00:00 02:00:00
12-11-2014  Deny    02:00:00 02:00:00

答案1

可能是这样的:

#!/bin/bash

while read LINE ; do
 [[ -n "`echo $LINE | awk '{print " "$NF}' | grep ' 00:'`" ]] && echo "$LINE" | tee -a test1.txt
 [[ -n "`echo $LINE | awk '{print " "$NF}' | grep ' 01:'`" ]] && echo "$LINE" | tee -a test2.txt
 [[ -n "`echo $LINE | awk '{print " "$NF}' | grep ' 02:'`" ]] && echo "$LINE" | tee -a test3.txt
done < test.txt

在哪里 :

while read LINE ; do ; done < FILE

是一个循环,读取 FILE 的每一行

[[ -n "`<command>`" ]] &&

意思是:如果<command>输出一个非零长度的字符串,那么......

echo "these are something"| awk {print $NF} | grep 'thing' 

意思是:读到“这些是某物”,只保留最后一列,看看其中是否有“某物”。

echo "something" | tee -a FILE

意思是:我在文件中打印“某些东西”,不会覆盖任何内容,如果它尚不存在则创建它。

答案2

使用awk,你可以这样做

awk '{split($3,a,":"); print > "test"a[1]+1".txt";}' test.txt


在纯粹的情况下,bash我不确定最好的方法 - 虽然你可以做类似的事情

while read -r line; do 
  read -r a b c d <<< "$line"
  printf -v outfile "test%d.txt" $(( ${c%%:*} + 1 ))
  printf "%s\n" "$line" >> "$outfile"
done < test.txt

答案3

尝试这个脚本:

#!/bin/bash
while read line; do 
HOUR=`echo $line | cut -d' ' -f3 | cut -d':' -f1`;
echo $line >> test-$HOUR.txt;
done < test.txt

对于文件中的每一行,命令cut首先将行拆分为space,然后拆分为:。结果用作文件的后缀。

输出为:

file-00.txt  file-01.txt  file-02.txt  

包含小时 00、01 等等的行。

相关内容