2014-07-21 67 views
0

我有一個非常大的文件(2.5M記錄),其中2列與|分開。 我想篩選第二列中不包含值「-1」的所有記錄,並將其寫入新文件。有條件的Linux awk

我試着使用:

grep -v "-1" norm_cats_21_07_assignments.psv > norm_cats_21_07_assignments.psv 

但野應運氣。

+1

提示:'awk的-F 「|」 '{print $ 2}'返回第二列.. – Maroun

回答

0

你可以通過AWK做到這一點,

awk -F"|" '$2~/^-1$/{next}1' file > newfile 

例子:

$ cat r 
foo|-1 
foo|bar 
$ awk -F"|" '$2~/^-1$/{next}1' r 
foo|bar 
+1

'/ -1 /'也會碰到'-10'' -12123'等等,你需要'$ 2〜/^- 1 $ /'或'$ 2 ==「 - 1」' – Jotne

0

您可以:

awk -F'|' '$2 != "-1"' file.psv > new_file.psv 

或者

awk -F'|' '$2 !~ /-1/' file.psv > new_file.psv 
  • !=整列相匹配,而!~需求只是其中的一部分。

編輯:只是注意到你的輸入文件和輸出文件是相同的。你不能這樣做,因爲即使在awk開始讀取文件之前,相同文件的輸出文件也會被截斷。

使用awk製作新的過濾文件(例如new_file.psv)後,可以使用cat new_file.psv > file.psvmv new_file.psv file.psv將其保存回來。

但不知何故,如果你到底有沒有與周圍隔開| 2列之間沒有空格,不包括引號,等等。你可以只使用與sed內聯編輯:

sed -i '/|-1/d' file.psv 

也許東西相當於awk -F'|' '$2 !~ /-1/'

sed -i '/|.*-1/d' file.psv 
+0

我試過awk -F「|」 '$ 2!=「 - 1」'norm_cats_21_07.psv> norm_cats_21_07_assignments.psv,但它似乎不起作用 – user3628777

+0

@ user3628777你能從文件中顯示一些行嗎?另外,確保你的文件是UNIX格式的:'sed -i's | \ r ||' your_file' – konsolebox

+0

我的錯誤 - 分隔符錯誤。在將「分隔符」修改爲「|」之後到「」它的工作 – user3628777

1

爲了快速和骯髒的解決方案,你可以簡單地添加|到您的grep:

grep -v "|-1" input.psv > output.psv 

這是假定行被忽略的樣子

something|-1 

請注意,如果您需要使用grep -v "-1",你有選擇後添加--,否則的grep將把-1作爲一個選項,是這樣的:

grep -v -- "-1"