2011-05-24 26 views
4

我這行的文件中:發現場的數量

,2,353867835022;11,353681041426390,272023201187741,272-02f-20017-06609,353854100352;11,,,,,,,0854100352,3,00,,O,D,DATA,,,7124395,,,17687,16,HPLMN,M20MSS_TTFILE_8377_20110528170245,M20MSS,W30B22I;0GRI3,1,20110528130013,170054,1,41,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001820,,,,b60a5c0014,1:353867835022::::0854100352::353854100352,,,,,,,, 

是, 這是一個逗號「」分隔file.there是一個數字17687。我想知道什麼是該行中該字段的編號。 我想使用爲基礎,包括在一個shell腳本。

回答

3

域#26:

% awk -F',' '/17687/ { 
    for (f = 0; f < NF; ++f) { 
     if ($f == "17687") { 
      print $f " found in field number " f " of " NF " on line " NR "." 
     } 
    } 
}' test.csv 
17687 found in field number 26 of 75 on line 1. 

這允許在多條線路上的多個字段找到17687。

希望這會有所幫助。

3

所以,你想逗號的17687前有多少?一種方法是:

sed -r 's/(^.*,)17687,.*$/\1/;s/[^,]//g'|wc -c 

這會抓住17687之前的所有內容,刪除所有非逗號,並計算字符數。

在腳本中使用這個,你可能會做這樣的事情:

FIELD_NO=`sed -r 's/(^.*,)17687,.*$/\1/;s/[^,]//g'|wc -c` 
cut -d',' -f$FIELD_NO some_file 
1

您還可以使用TR改變你的字段分隔成換行,grep來查找行和貓,如果你想。例如:

$ cat t.csv|tr ',' '\n'|cat -n|grep 17687 
    26 17687 

或更好

$ cat t.csv|tr ',' '\n'|grep -n 17687 
26:17687 

甚至

$ tr ',' '\n' < t.csv |grep -n 17687 
26:17687 
+1

的OP沒有說,但我猜想,這是具有大量的CSV式記錄的文件的第一行,因此轉動逗號到新行可能會打破分辨某個特定的能力記錄結束。 – 2011-05-24 06:42:58

1

的Perl?

FLD="17687" 
perl -F/,/ -slane '%h=map{$_,++$i}@F ;print $h{$fld}||0' -- -fld="$FLD" 

對於您的示例行,將打印26(從1開始計數)或「0」(如果未找到)。將搜索字符串的最後一個索引。

perl -F/,/ -slane 'map{print}grep { $F[$_] eq $fld } 0..$#F;' -- -fld="$FLD" 

將只使用一個正則表達式打印所有索引,或沒有(從0開始計數)...

1

小的提升超過David's版本。

sed -r "s/17687,.*|[^,]*//g" | wc -c 
1

awk中oneliner,單一的過程:

awk -F, '/17687/{n=NF;sub(".*,17687,","");print n-NF}' file 

對於大文件使用快如閃電的mawk如果您的平臺上。