3个动作,cat,grep然后wc,来自之前的信息

时间:2016-08-19 10:18:45

标签: bash unix awk grep cat

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

1st ls dir

ls
  • FILE1.TXT
  • FILE2.TXT
  • file3.txt 等...

第二个grep,每个都是唯一的

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

应输出数字

  • 83886096
  • 1040187393
  • 201326673 等...

和第三,使用找到的uniq数字来grep它来自的文件来计算有多少

cat $file | grep $output | wc -l

以某种方式在行上获得$ file $ output $ count的好输出

提前谢谢你

我假设我必须做一些这种性质但更复杂的事情(因为我无法让它发挥作用)

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

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

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

因此它找到了文件并读取了它们但无法进行计数

4 个答案:

答案 0 :(得分:5)

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

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

然后,你说:

OUTPUT=cat ${FILE} | awk '{print $8}' |  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[$8]++} ENDFILE {print FILENAME; for (f in count) print f, count[f]; delete count}' *

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

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

查看一些示例输入/输出:

$ 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[$8]++} 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

答案 1 :(得分:1)

使用@ fedorqui&#39;(感谢提供)数据:

@(Html.Kendo().ComboBoxFor(x => x.Types.Name).Name("typesCombo")
                                             .DataTextField("Name")
                                             .DataValueField("Id")
                                             .HtmlAttributes(new { style = "width:100%", id = "typesCombo" })
                                             .BindTo(Model.TypesList))

答案 2 :(得分:0)

也许这个答案完全是你不想要的,但无论如何我都会尝试:我建议你写一个命令来查看文件的名称,然后是它们的内容,你可以把它放进去一个日志文件,如下所示:

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

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

答案 3 :(得分:-1)

我认为这就是你要做的事情

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

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