2013-11-25 28 views
1

我有下面的数据文件:搜索unix文件中的列?

136110828724515000007700877 
137110904734015000007700877 
138110911724215000007700877 
127110626724515000007700871 
127110626726015000007700871 
131110724724515000007700871 
134110814725015000007700871 
134110814734015000007700871 
104110122726027000001810072 
107110208724527000002900000 

而且我想提取的6787714447. 列3即值的价值我试着用: -

awk "print $3" <filename> 

,但它没有工作。我应该用什么来代替?

+2

那里的列之间没有明显的分隔。请确定列边界的位置。您可能需要使用'cut'和'-c'。你说你正在寻找的字符串没有出现在你的样本数据中,这也没有帮助,除非你的意思是你希望列3中的值连接成一个没有空格的单个字符串。 –

回答

1

剪切可能是简单/清洁剂的选择,但这里有两个备选方案:

AWK版本:

awk '{print substr($1, 3, 1) }' <filename> 

Python版本:

python -c 'print "\n".join(map(lambda x: x[2], open("<filename>").readlines()))' 

编辑:请参阅1_CR的意见和忽视赞成他的这个选项。

+1

'python -c'print'\ n“.join(x [2] for x in open(”file“))''为我的钱 – iruvar

+0

好,少一点代码。 :) – Goncalo

+1

它不只是代码的大小。 'readlines()'导致整个文件被加载到内存中。生成器版本不好 – iruvar

6

这是cut一个更好的工作:

$ cut -c 3 < file 
6 
7 
8 
7 
7 
1 
4 
4 
4 
7 

man cut

-c,--characters = LIST

只选择这些字符

为了让它们看起来都在同一行,管tr -d '\n'

$ cut -c 3 < file | tr -d '\n' 
6787714447 

甚至sed有在年底新线:

$ cut -c 3 < file | tr -d '\n' | sed 's/$/\n/' 
6787714447 

随着

$ grep -oP "^..\K." file 
6 
7 
8 
7 
7 
1 
4 
4 
4 
7 

$ sed -r 's/..(.).*/\1/' file 
6 
7 
8 
7 
7 
1 
4 
4 
4 
7 

$ awk '{split ($0, a, ""); print a[3]}' file 
6 
7 
8 
7 
7 
1 
4 
4 
4 
7 
+1

然后你可以加入使用tr就像这样:'cut -c 3/some/file | tr -d'\ n'' –

+0

好的,@gerritzijlstra,如果你不介意的话,我会在我的答案中包含这个好的建议。谢谢! – fedorqui

+0

'awk -v FS ='{print $ 3}'file'应该可以工作,至少在GNU awk – iruvar