簡體   English   中英

如何使用 bash 計算文件中的行數和列數?

[英]How do I count the number of rows and columns in a file using bash?

假設我有一個包含多行多列的大文件。 我想知道我使用 bash 有多少行和列。

列: awk '{print NF}' file | sort -nu | tail -n 1 awk '{print NF}' file | sort -nu | tail -n 1

使用head -n 1表示最低列數, tail -n 1表示最高列數。

行: cat file | wc -l cat file | wc -lwc -l < file用於UUOC人群的wc -l < file

或者計算列數,計算列之間的分隔符。 我發現這是簡潔和易於記憶的良好平衡。 當然,如果您的數據包含列分隔符,這將不起作用。

head -n1 myfile.txt | grep -o " " | wc -l

使用head -n1抓取文件的第一行。 使用grep -o來計算所有空格,並輸出在新行上找到的每個空格。 使用wc -l計算行數。

編輯:正如 Gaurav Tuli 在下面指出的那樣,我忘了提到你必須在心理上給結果加 1,或者以其他方式編寫這個數學。

如果您的文件很大但您確定每行的列數保持不變(並且您沒有標題),請使用:

head -n 1 FILE | awk '{print NF}'

查找列數,其中 FILE 是您的文件名。

要查找行數,'wc -l FILE' 將起作用。

kirill_igum 的答案稍有改動,您可以輕松計算您想要的任何特定行的列數,這就是我提出這個問題的原因,即使該問題要求的是整個文件。 (雖然如果您的文件在每一行中都有相同的列,這當然也仍然有效):

head -2 file |tail -1 |tr '\t' '\n' |wc -l

給出第 2 行的列數。例如用 55 替換 2 以獲得第 55 行的列數。

-bash-4.2$ cat file
1       2       3
1       2       3       4
1       2
1       2       3       4       5

-bash-4.2$ head -1 file |tail -1 |tr '\t' '\n' |wc -l
3
-bash-4.2$ head -4 file |tail -1 |tr '\t' '\n' |wc -l
5

如果您的文件由制表符分隔,則上面的代碼有效,因為我們將其定義為“tr”。 如果您的文件有另一個分隔符,比如逗號,您仍然可以使用相同的技巧通過簡單地將分隔符“t”更改為“,”來計算“列”:

-bash-4.2$ cat csvfile
1,2,3,4
1,2
1,2,3,4,5
-bash-4.2$ head -2 csvfile |tail -1 |tr '\,' '\n' |wc -l
2

如果計算第一列的數量就足夠了,請嘗試以下操作:

awk -F'\\t' '{print NF; exit}' myBigFile.tsv

其中\\t是列分隔符。

您可以使用 bash。 請注意,對於以 GB 為單位的非常大的文件,請使用awk/wc 但是,對於幾 MB 的文件,它的性能應該仍然可以管理。

declare -i count=0
while read
do
    ((count++))
done < file    
echo "line count: $count"
head -1 file.tsv |head -1 train.tsv |tr '\t' '\n' |wc -l

取第一行,更改制表符(或者您可以使用 ',' 而不是 '\\t' 作為逗號),計算行數。

awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' file

您可以使用任何分隔符作為字段分隔符,並可以找到行數和列數

簡單的行數是$(wc -l "$file") 使用$(wc -lL "$file")顯示行數和最長行中的字符數。

對於行,您可以簡單地使用wc -l file

-l代表總行

對於列,您可以簡單地使用head -1 file | tr ";" "\\n" | wc -l head -1 file | tr ";" "\\n" | wc -l

解釋
head -1 file
獲取文件的第一行(應該是標題),然后通過管道將其發送到下一個 cmd
| tr ";" "\\n"

tr代表翻譯。
它將全部翻譯; 字符轉換為換行符。
在這個例子中; 是你的分隔符。

然后它將數據發送到下一個命令。

wc -l
計算總行數。

Perl解決方案:

perl -ane '$maxc = $#F if $#F > $maxc; END{$maxc++; print "max columns: $maxc\\nrows: $.\\n"}' file

如果您的輸入文件以逗號分隔:

perl -F, -ane '$maxc = $#F if $#F > $maxc; END{$maxc++; print "max columns: $maxc\\nrows: $.\\n"}' file

輸出:

max columns: 5
rows: 2

-a將輸入行自動拆分為@F數組
$#F是列數 -1
-F,字段分隔符 , 而不是空格
$. 是行號(行數)

在純 bash(無 awk、perl 或其他語言)中計算第一行列的一種非常簡單的方法:

read -r line < $input_file
ncols=`echo $line | wc -w`

如果您的數據格式正確,這將起作用。

以下代碼將完成這項工作,並允許您指定字段分隔符。 這對於包含超過 20k 行的文件特別有用。

awk 'BEGIN { 
  FS="|"; 
  min=10000; 
}
{ 
  if( NF > max ) max = NF; 
  if( NF < min ) min = NF;
} 
END { 
  print "Max=" max; 
  print "Min=" min; 
} ' myPipeDelimitedFile.dat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM