Как я могу удалить пятое слово каждой строки в файле?

Я хочу удалить пятое слово каждой строки в файле.

Текущее содержимое файла:

File is not updated or and will be removed System will shut down f within 10 seconds Please save your work 55 or copy to other location Kindly cooperate with us D 

Ожидаемый результат:

 File is not updated and will be removed System will shut down within 10 seconds Please save your work or copy to other location Kindly cooperate with us 

Как насчет cut :

 $ cut -d' ' -f1-4,6- file.txt File is not updated and will be removed System will shut down within 10 seconds Please save your work or copy to other location Kindly cooperate with us 
  • -d' ' устанавливает разделитель как пробел

  • -f1-4,6- выбирает первое-четвертое поле (слово), оставляя пятый, а затем продолжая печать с 6-го до конца.

Решение с cut :

 cut -d ' ' -f1-4 -f6- FILE 

awk: удалить пятое поле

 awk '{for (i=5; i<NF; i++) $i = $(i+1); NF--};1' file 

Если вы хотите сохранить файл на месте: https://stackoverflow.com/q/16529716/7552

Вы можете просто удалить содержимое 5-го поля, но это оставляет два последовательных разделителя полей вывода:

 awk '{$5 = ""};1' file 

С помощью POSIX sed:

 sed -e 's/[^[:alnum:]_][[:alnum:]_][[:alnum:]_]*//4' <file 

Гленн предложил решение, эквивалентное

  awk '{$ 5 = "";  print} ' 

Как он и другие указали, это

  1. полосы, ведущие и завершающие пробелы из каждой строки,
  2. сжимает каждую строку пробелов (пробелы и / или вкладки) в одно пространство и
  3. оставляет два пробела между четвертым и шестью словами.

Взлом для исправления третьей проблемы

  awk '{$ 5 = "";  print} ' файл |  sed 's / / /' 

Это все равно останется одним или несколькими добавленными пространствами в конце любой строки, в которой будет пять или меньше слов. Если вы можете определить слово, которое никогда не появится на входе,

  awk '{$ 5 = "единорог";  print} ' файл |  sed 's / * unicorn //' 

будет справляться даже с этим (но он все еще оставляет проблемы 1 и 2).

Perl.

 perl -ne 'print $_ =~ /^(\w+ +\w+ +\w+ +\w+ +)\w+ (.*)/,"\n"' file 
  sed 's/^\(\([[:blank:]]*[^[:blank:]]\{1,\}\)\{4\}\)[[:blank:]]*[^[:blank:]]*/\1/' YourFile > Output.txt 
  • posix sed на основе разделителя пространства / табуляции (meta class [: blank:]])
  • сохраните следующее пространство после 5-го слова, но сначала удалите его

Более надежный (sed принимает самый длинный шаблон и шаблон с * может пропустить разделение или слово в первой версии), но немного более длинная версия

 sed 's/^\([[:blank:]]*\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{4\}\[^[:blank:]]\{1,\}/\1/' YourFile > Output.txt 

Другая возможность, предполагающая сокращение GNU:

 cut -d' ' -f5 --complement file.txt 

Используя Perl> 5.10 (и успешно выводя все строки: 0)): –

 perl -nE '/^((\w+ +){4})\w+ *(.*)/; say $1.$3' file