【问题标题】:3 actions, cat, grep then wc with info from before3 个动作,cat, grep 然后 wc 与之前的信息
【发布时间】:2016-12-26 11:13:07
【问题描述】:

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

第一个 ls 目录

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

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

【问题讨论】:

  • oook 这或多或少很清楚,但您能否显示minimal reproducible example,以便我们可以处理已定义的案例?
  • 定义大小写是什么意思
  • 一些样本输入和期望的输出
  • 所以给定一组文件,您想计算每个文件中第 8 个字段出现的次数,对吧?请注意,您的尝试有一些可以通过 shellcheck.net 跟踪的语法错误。例如,要将输出存储在一个变量中,你需要说var=$(command),所以你应该说OUTPUT=$(awk '...' file | sort | uniq)

标签: bash unix awk grep cat


【解决方案1】:

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

【讨论】:

  • 不错。由于 ENDFILE,您应该只添加它是 gawk 特定的。
【解决方案2】:

使用@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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      我不知道你的文件分隔符是什么,所以假设一个空格应该可以工作。

      【讨论】:

      • 这在几乎所有方面都是错误的方法,并且在给定各种文件名和内容的情况下都会失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2020-07-22
      • 2015-03-30
      • 1970-01-01
      • 2013-10-01
      • 2021-04-18
      • 2013-12-24
      相关资源
      最近更新 更多