2015-05-28 4 views
1

У меня есть большой (15 Gb) табуляцией delimered текстовый файл (например, «Test.csv»):Bash способ удалить пробелы в одном столбце огромного файла

ID1   ID2   ID3     ID4 
Some text Some text Text to be cleared Some text 

Проблема заключается в том, как удалить все пробелы в столбце ID3 с помощью сценария bash (Mac OS X 10.10). Таким образом, результат должен быть следующим:

ID1   ID2   ID3     ID4 
Some text Some text Texttobecleared Some text 

Обозначение столбца «\ t».

ответ

4

Вы должны быть в состоянии сделать что-то вроде этого

awk -F"\t" -v OFS="\t" '{gsub(" ", "", $3); print}' < file 

Заменить file на путь к файлу.

-F"\t" говорит, чтобы использовать символ табуляции в качестве разделителя при идентификации столбцов со входа.

-v OFS="\t" говорит, чтобы использовать символ табуляции для разделения столбцов на выходе.

gsub изменяет колонку 3 $3 и заменяет все пробелы " " пустой строкой.

+2

Вам нужно добавить '-v OFS =" \ t "', чтобы избежать смены разделителей вывода на пробелы. – tripleee

+0

@ tripleee хороший catch. Я не знал об этом. – jcbwlkr

+0

Большое спасибо за вас, ребята! К сожалению, только один ответ может быть решением. –

1

С встроенных командах в Bash:

while IFS=$'\t' read id1 id2 id3 id4; do echo -e "$id1\t$id2\t${id3// /}\t$id4"; done <file_original> file_new 

Выход:

 
ID1  ID2  ID3  ID4 
Some text  Some text  Texttobecleared Some text 
+0

Вероятно, вы должны использовать 'read -r', чтобы не испортить контент. Очки для попытки, но опыт показывает, что использование встроенных модулей Bash, подобных этому, на самом деле будет медленнее, чем простой инструмент, такой как Awk. – tripleee

1

Sed путь

sed ':T;s/^\(\([^\t]*\t\)\{2\}\)\([^\t]*\) /\1\3/;tT' file 

или с GNU и -r

ssed -r ':T;s/^(([^\t]*\t){2})([^\t]*) /\1\3/;tT' file