3 个动作,猫,grep 然后 wc 与之前的信息

3 actions, cat, grep then wc with info from before

我已经搜索过,但到目前为止一无所获。我想列出一个目录,然后将每个文件分类为唯一项目,然后使用这两个项目来计算文件中的项目。

第一个 ls 目录

ls

第 2 次 grep 每个唯一的

cat $file | awk '{print }' |  sort | uniq 

应该输出数字

第 3 步,使用找到的 uniq 编号来 grep 它来自的文件来计算有多少

cat $file | grep $output | wc -l

并以某种方式通过 $file $output $count on lines

得到一个不错的输出

提前致谢

我假设我将不得不做这种性质的事情,但更复杂(因为我无法让它工作)

FILE="$(ls -1)"
ls > list.txt
input=list.txt
while read line
do
OUTPUT=cat ${FILE} | awk '{print }' |  sort | uniq 
cat ${FILE} | grep ${OUTPUT} | wc -l
done < "$input"

当我 运行 它时,它似乎有点工作,我得到以下输出

grep: 0652-033 Cannot open 83886096.
       0
grep: 0652-033 Cannot open 83886096.
       0

所以它找到了文件并读取了它们但无法计数

我想这就是你想要做的

ls | awk '{print "> "; system("cat "" | cut -f8 | sort | uniq");}' | awk '{if(==">"){ Filename=; next;} printf Filename" "" ";system("cat "Filename" | grep "" | wc -l") }}'

我不知道你的文件分隔符是什么,所以假设空格剪切应该有效。

Do nont parse the output of ls。相反,只需循环遍历文件。这样你也可以避免使用中间文件:

for file in *;
do
   # things with "$file"
done

那么,你是说:

OUTPUT=cat ${FILE} | awk '{print }' |  sort | uniq 

首先,将命令的输出存储在变量中需要语法 var=$(command)。否则,当你说 var=command1 command2... one of these things can happen 时。那么,cat file | awk '...'就相当于awk '...' file,所以可以直接说OUTPUT=$(awk "$FILE" | sort | uniq)awk 可以单独完成所有这些,但我们稍后会解决这个问题。

cat ${FILE} | grep ${OUTPUT} | wc -l

此处与 cat 相同。另外,grep -c 这样做,所以你可以说:

grep -c "$OUTPUT" "$FILE"

加起来就是:

for file in *;
do
   OUTPUT=$(awk "$FILE" | sort | uniq)
   grep -c "$OUTPUT" "$FILE"
done

但其实awk一个人就可以做到:

awk '{count[]++} ENDFILE {print FILENAME; for (f in count) print f, count[f]; delete count}' *

循环遍历当前目录中的所有文件,并计算给定的第 8 个字段在每个文件中出现的次数。然后它会打印每个文件的摘要。

注意这是 GNU awk 特定的,因为它使用 ENDFILE

查看示例 input/output:

$ tail f*
==> f1 <==
field1 field2 field3 field4 field5 field6 field7 xfield8 field9
field1 field2 field3 field4 field5 field6 field7 yfield8 field9
field1 field2 field3 field4 field5 field6 field7 yfield8 field9
field1 field2 field3 field4 field5 field6 field7 zfield8 field9

==> f2 <==
field1 field2 field3 field4 field5 field6 field7 xfield8 field9
field1 field2 field3 field4 field5 field6 field7 yfield8 field9
field1 field2 field3 field4 field5 field6 field7 zfield8 field9
field1 field2 field3 field4 field5 field6 field7 zfield8 field9

==> f3 <==
field1 field2 field3 field4 field5 field6 field7 xfield8 field9
field1 field2 field3 field4 field5 field6 field7 xfield8 field9
field1 field2 field3 field4 field5 field6 field7 xfield8 field9
field1 field2 field3 field4 field5 field6 field7 yfield8 field9
field1 field2 field3 field4 field5 field6 field7 yfield8 field9
field1 field2 field3 field4 field5 field6 field7 zfield8 field9
$ awk '{count[]++} ENDFILE {print FILENAME; for (f in count) print f, count[f]; delete count}' f*
f1
xfield8 1
yfield8 2
zfield8 1
f2
xfield8 1
yfield8 1
zfield8 2
f3
xfield8 3
yfield8 2
zfield8 1

使用@fedorqui 的(感谢提供)数据:

$ for i in f[123]; do echo "$i:"; cut -d \  -f 8 "$i" |sort|uniq -c; done
f1:
      1 xfield8
      2 yfield8
      1 zfield8
f2:
      1 xfield8
      1 yfield8
      2 zfield8
f3:
      3 xfield8
      2 yfield8
      1 zfield8

也许这个答案完全不是你要找的,但我还是会试试:我建议你写一个命令来查看文件的名称,然后是它们的内容,你可以把将其写入日志文件,如下所示:

file1 content1
file1 content1
file1 content2
file2 content1
file2 content2
file2 content2
file2 content2
...

然后将此文件导入 Excel,然后使用小计或其他数据分析功能即可完成工作。