Как удалить первые три столбца в файле с разделителями

Например, у меня есть файл csv, как показано ниже,

12345432|1346283301|5676438284971|13564357342151697 ...
87540258|1356433301|1125438284971|135643643462151697 ...
67323266|1356563471|1823543828471|13564386436651697 ...

и еще сотни столбцов, но я хочу удалить первые три столбца и сохранить в новый файл (если возможно, мне лучше подойдет тот же файл)

Вот какой результат я хочу.

13564357342151697 ...
135643643462151697 ...
13564386436651697 ...

Я искал и пытался, но не могу. И ниже код, который у меня есть.

awk -F'|' '{print $1 > "newfile"; sub(/^[^|]+\|/,"")}1' old.csv > new.csv

Цените, если кто-то может мне помочь. Спасибо.


awk
person Heng Unn    schedule 07.03.2017    source источник
comment
Отметьте stackoverflow.com/questions/ 2626274 /   -  person Utsav    schedule 07.03.2017
comment
@Utsav Я пробовал, но все мои данные испорчены. Это из-за того, что мой разделитель | ?   -  person Heng Unn    schedule 07.03.2017


Ответы (4)


@Heng: попробуйте:

awk -F"|" '{for(i=4;i<=NF;i++){printf("%s%s",$i,i==NF?"":"|")};print ""}'  Input_file

ИЛИ

awk -F"|" '{for(i=4;i<=NF;i++){printf("%s%s",$i,i==NF?"\n":"|")};}'  Input_file

вы можете перенаправить вывод этой команды в файл в соответствии с вашими потребностями.

РЕДАКТИРОВАТЬ:

awk -F"|" 'FNR==1{++e;fi="REPORT_A1_"e;} {for(i=4;i<=NF;i++){printf("%s%s",$i,i==NF?"\n":"|") > fi}}'   Input_file1  Input_file2  Input_file3
person RavinderSingh13    schedule 07.03.2017
comment
Спасибо, @ RavinderSingh13! Вырезать тоже работает. Вы знаете, можно ли удалить первые три столбца сразу для 10 файлов? Мне нужно использовать цикл с вырезанием или awk? - person Heng Unn; 07.03.2017
comment
Да, с awk мы могли бы это сделать, но нам нужно знать ваши требования и ожидаемый результат, чтобы помочь вам больше. Пожалуйста, опубликуйте то же самое с деталями. - person RavinderSingh13; 07.03.2017
comment
Я хочу сохранить вывод в файлы csv. Если мне нравится то, что вы предложили Input_file1 Input_file2 Input_file3 ............ Input_file10, значит ли это, что я тоже должен выводить его для разделения имен файлов? Поскольку все мои 10 файлов имеют похожие имена, такие как REPORT_A1_1, REPORT_A1_2, REPORT_A1_3, ........ REPORT_A1_10, поэтому мне интересно, могу ли я иметь функцию для вызова всех этих 10 файлов для последовательного удаления? - person Heng Unn; 07.03.2017
comment
Я здесь прокомментировал. @ RavinderSingh13 - person Heng Unn; 07.03.2017
comment
пожалуйста, ознакомьтесь с моей редакцией моего ответа, вам может понравиться, если ваш вопрос тоже будет решен :) - person RavinderSingh13; 07.03.2017
comment
Это тоже работает, чувак. Ты обалденный. Спасибо. Еще один вопрос, после удаления первых трех столбцов, можно ли заменить его на исходное имя файла и сделать то же самое для 10 файлов одновременно? @ RavinderSingh13 - person Heng Unn; 07.03.2017
comment
Я не понял, вы хотите поместить все 10 выходных файлов Input_files в один и тот же Input_file? - person RavinderSingh13; 07.03.2017
comment
Если это так, то вы можете просто поместить вывод команды в temp_input_file, а затем переименовать его в Input_file, дайте мне знать, поможет ли это. - person RavinderSingh13; 07.03.2017
comment
Нет, я не это имел в виду. Приведу пример. Например, REPORT_A1_1 был удален для первых трех столбцов, верно? И я хочу, чтобы данные сохранялись с тем же именем файла REPORT_A1_1. И я хочу сделать это для всех 10 файлов одновременно, возможно ли? Приносим извинения за непонятную информацию и благодарим вас за терпение. @ RavinderSingh13 - person Heng Unn; 07.03.2017

Вы можете использовать cut:

cut -f4- -d'|' old.csv  > new.csv
person Bertrand Martel    schedule 07.03.2017
comment
Эффективнее, чем awk. - person codeforester; 07.03.2017
comment
Большое спасибо. Вы, ребята, знаете, можно ли вырезать первые три столбца для 10 файлов одновременно? Мне нужно использовать цикл? - person Heng Unn; 07.03.2017
comment
@HengUnn: Пожалуйста, опубликуйте образец ввода и ожидаемый результат, чтобы он был более понятным. - person RavinderSingh13; 07.03.2017
comment
@ RavinderSingh13 Примеры ввода и вывода такие же, как и те, что я опубликовал выше. Всего у меня есть 10 файлов, из которых все, что мне нужно, также удалить первые три столбца. Интересно, есть ли способы сделать вместе на 10 файлов? Поэтому мне просто нужно отбросить первые три столбца для 10 файлов только за один раз. - person Heng Unn; 07.03.2017
comment
@HengUnn: просто попробуйте с моей командой awk выше, а затем Input_file1 Input_file2 Input_file3 ............ Input_file10 и дайте мне знать, поможет ли это вам. - person RavinderSingh13; 07.03.2017

Это то, что вы ищете:

awk -F '|' '{$1=$2=$3=""; print $0}' oldfile > newfile

Но в начале будут пробелы, поэтому добавьте следующую замену:

sub (/ ^ [\ t \ |] + /, "") -> изменено на sub (/ ^ [\ t \ |] + /, "") (экранировано ведущим '|' от удаления столбца)

awk -F '|' '{$1=$2=$3="";OFS="|";sub(/^[ \t\|]+/,"") ;print $0}' oldFile > newFile

person SVTAnthony    schedule 07.03.2017
comment
Спасибо @SVTAnthony. Я пробовал использовать ваш код, но мои результаты были испорчены. Все столбцы помещаются в один столбец. - person Heng Unn; 07.03.2017
comment
используйте 1_ - person Bertrand Martel; 07.03.2017
comment
Я только что отредактировал пример, чтобы он соответствовал вашим потребностям. Что мне не хватало, так это разделитель выходных полей (OFS), я также немного почистил ведущие разделители, вызванные удалением полей. Спасибо, что дал мне знать. - person SVTAnthony; 07.03.2017
comment
Следует установить OFS перед настройкой $1=$2=$3="" - желательно в BEGIN или командной строке -vOFS='|' - и тогда вам понадобится только sub(/^\|\|\|/,"") или даже проще print substr($0,4) - person dave_thompson_085; 09.03.2017

person    schedule
comment
Привет !, прочтите stackoverflow.com/help/how-to-answer и попытайтесь объяснить, почему это код. Спасибо! - person Eel Lee; 09.03.2017
comment
Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, его можно было бы значительно улучшить, если бы он включал объяснение того, как и почему это решает проблему. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person Toby Speight; 10.03.2017