我怎么知道许多txt文件的行数和列数

时间:2016-12-08 20:56:48

标签: bash macos terminal

我的目录中有很多文件。 很难一个接一个地打开,看看它们有多少行或者它们有多少列。

我想知道是否有任何自动方式

举个例子。我在桌面上创建了一个txt文件,并将其称为我的文件

check   myfile  Myname 
FALSE   0      Q9Y383
FALSE   1      Q9Y383
FALSE   2      Q9Y383
FALSE   3      Q15366-2
FALSE   6      Q15366-2
FALSE   7      Q15366-2

我将其粘贴在那里,所以我确信我有3列7行(当我用xls文件打开它们时)

我尝试为

这样的单个文件执行此操作
wc -l mytextfile

显示0

这只是一个文件,如果我有1000个文件怎么办?

4 个答案:

答案 0 :(得分:3)

wc -l file会显示行数;假设标题中包含逗号分隔值且没有文字逗号,read -r -d $'\r' -a cols <file && echo "${#cols[@]}"将为您提供列数(在第一行中)。

所有这些都适用于通配符。如果您有1000个文件,则可以运行:

printf '%s\0' *.txt | xargs -0 wc -l

...或...

for file in *.txt; do
  read -r -a cols <"$file" && echo "$file ${#cols[@]}"
done

请注意,至少在另一个问题中,您有一个带CR换行符的文本文件,而不是LF或CRLF换行符。对于那些,您将要使用read -r -d $'\r' -a cols

同样,如果您的文本文件格式因同样的原因阻止wc -l正常工作,您可能需要以下效率低得多的替代方案:

for file in *.txt; do
  printf '%s\t' "$file"
  tr '\r' '\n' <"$file" | wc -l
done

答案 1 :(得分:3)

假设:

$ cat /tmp/f.txt
check   myfile  Myname 
FALSE   0      Q9Y383
FALSE   1      Q9Y383
FALSE   2      Q9Y383
FALSE   3      Q15366-2
FALSE   6      Q15366-2
FALSE   7      Q15366-2

对于单个文件,您可以使用awk

$ awk 'NR==1{cols=NF} END{print cols, NR}' /tmp/f.txt
3 7

如果您有gawk,则可以轻松处理多个文件(*.ext)文件:

$ gawk 'BEGIN { printf "%4s%8s\n", "cols", "lines"}
        FNR==1{cols=NF} 
        ENDFILE{cnt++;printf "%3i %10i %-60s\n", cols, FNR, FILENAME} 
        END{ printf "%14i lines in %i files\n", NR, cnt}' /tmp/*.txt

哪个产生(对我来说)

cols   lines
  3          7 /tmp/f.txt                                                  
  1   20000000 /tmp/test.txt                                               
      20000007 lines in 2 files

修改

如果您有古老的Mac文件(newlines不是某种形式的\n),您可以这样做:

$ awk -v RS='\r' 'NR==1{cols=NF} END{print cols, NR}' your_file

或者,

 $ gawk -v RS='\r'  'BEGIN { printf "%4s%8s\n", "cols", "lines"}
                 FNR==1 { cols=NF } 
                 ENDFILE { cnt++;printf "%3i %10i %-60s\n", cols, FNR, FILENAME } 
                 END { printf "%14i lines in %i files\n", NR, cnt}' *.files

答案 2 :(得分:0)

只需使用for声明。

for f in *
do
    wc -l "$f"
done

并在for循环中添加内容,当您还有其他重复内容时

答案 3 :(得分:0)

你的文件有'mac'行结尾 - 也就是说,行是由回车符而不是换行符(它们是'unix'行结尾)分隔的,而wc只能识别后者。< / p>

您有两种选择:将输入文件转换为“mac”行结尾一次或即时。

例如

% alias frommac="tr '\r' '\n'"
% frommac <myfile >myfile.unix
% wc -l myfile.unix

% frommac <myfile | wc -l

如果您有很多这些文件,那么您可以执行类似

的操作
% wc -l *.unix

(如果您已按上述方式预转换输入文件)或

% for f in *; do frommac <$f | wc -l; done

......或类似的东西。