Как я могу использовать `awk` для разделения текста в столбце?

Это язык программирования, который скомпилирован в C (см. Википедию). Это первый раз, когда я видел его использование - cool:)

Если вы установите valac из synaptic или Software Center, вы должны пройти эту проверку.

6
задан 19 May 2017 в 11:39

12 ответов

Используйте поле ​ { (пробел, фигурная скобка) в качестве разделителя полей, так как вы не заботитесь обо втором поле:

$ awk -F ' {' '{print $1}' foo
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"
11
ответ дан 22 May 2018 в 22:30

Используйте поле ​ { (пробел, фигурная скобка) в качестве разделителя полей, так как вы не заботитесь обо втором поле:

$ awk -F ' {' '{print $1}' foo "xxxxx1" "xx2" "xx3 gsdd" "sdsdf xxx" "sdfsdf ccc dd" "dsdsf sfsdf" "sdfsdfsd" "sdfsdff" "sdfsdfdff sdfs" "sdfsdsds sdfsdf d" "sdfsdfs sdf sdfsdf" "sdfsdfsdf sdf"
12
ответ дан 18 July 2018 в 13:05

Используйте поле ​ { (пробел, фигурная скобка) в качестве разделителя полей, так как вы не заботитесь обо втором поле:

$ awk -F ' {' '{print $1}' foo "xxxxx1" "xx2" "xx3 gsdd" "sdsdf xxx" "sdfsdf ccc dd" "dsdsf sfsdf" "sdfsdfsd" "sdfsdff" "sdfsdfdff sdfs" "sdfsdsds sdfsdf d" "sdfsdfs sdf sdfsdf" "sdfsdfsdf sdf"
12
ответ дан 24 July 2018 в 20:06

Если вы просто хотите, чтобы все между первым и последним символом двойной кавычки " каждой строки, самым простым решением, вероятно, было бы это, используя grep вместо awk:

grep -o '".*"' FILENAME

Переключатель -o позволяет grep выводить только совпадающие части, а не целую строку, содержащую совпадение. Шаблон (однокасканный, чтобы предотвратить интерпретацию оболочки) ".*" соответствует последовательности любого символа (.) с любой длиной (*), включая ноль, которая окружена двойными кавычками.

3
ответ дан 22 May 2018 в 22:30

В качестве альтернативы решению awk мура

с использованием cut:

cut -f 1 -d { < file.txt

с использованием grep:

grep -o '".*"' file.txt

или

grep -o \".*\" file.txt

, используя sed:

sed -r 's/(".*").*/\1/' file.txt

или

sed -r 's/\{.*\}//' file.txt

или даже:

sed 's/{.*//'
2
ответ дан 22 May 2018 в 22:30

Perl с группировкой (.*) тоже может это сделать:

$ perl -pe 's/"(.*)".*/"\1"/g' input.txt                                                    
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"

Фокус в том, что мы сопоставляем целую строку и используем "(.*)" для обработки всего между двойными кавычками как одной группой. Мы заменяем эту целую строку группой, которую мы сопоставляем, обращаясь к ней через часть \1.

1
ответ дан 22 May 2018 в 22:30

Если вы просто хотите, чтобы все между первым и последним символом двойной кавычки " каждой строки, самым простым решением, вероятно, было бы это, используя grep вместо awk:

grep -o '".*"' FILENAME

Переключатель -o позволяет grep выводить только совпадающие части, а не целую строку, содержащую совпадение. Шаблон (однокасканный, чтобы предотвратить интерпретацию оболочки) ".*" соответствует последовательности любого символа (.) с любой длиной (*), включая ноль, которая окружена двойными кавычками.

4
ответ дан 18 July 2018 в 13:05

В качестве альтернативы решению awk мура

с использованием cut:

cut -f 1 -d { < file.txt

с использованием grep:

grep -o '".*"' file.txt

или

grep -o \".*\" file.txt

, используя sed:

sed -r 's/(".*").*/\1/' file.txt

или

sed -r 's/\{.*\}//' file.txt

или даже:

sed 's/{.*//'
3
ответ дан 18 July 2018 в 13:05

Perl с группировкой (.*) тоже может это сделать:

$ perl -pe 's/"(.*)".*/"\1"/g' input.txt "xxxxx1" "xx2" "xx3 gsdd" "sdsdf xxx" "sdfsdf ccc dd" "dsdsf sfsdf" "sdfsdfsd" "sdfsdff" "sdfsdfdff sdfs" "sdfsdsds sdfsdf d" "sdfsdfs sdf sdfsdf" "sdfsdfsdf sdf"

Фокус в том, что мы сопоставляем целую строку и используем "(.*)" для обработки всего между двойными кавычками как одной группой. Мы заменяем эту целую строку группой, которую мы сопоставляем, обращаясь к ней через часть \1.

2
ответ дан 18 July 2018 в 13:05

Если вы просто хотите, чтобы все между первым и последним символом двойной кавычки " каждой строки, самым простым решением, вероятно, было бы это, используя grep вместо awk:

grep -o '".*"' FILENAME

Переключатель -o позволяет grep выводить только совпадающие части, а не целую строку, содержащую совпадение. Шаблон (однокасканный, чтобы предотвратить интерпретацию оболочки) ".*" соответствует последовательности любого символа (.) с любой длиной (*), включая ноль, которая окружена двойными кавычками.

4
ответ дан 24 July 2018 в 20:06

В качестве альтернативы решению awk мура

с использованием cut:

cut -f 1 -d { < file.txt

с использованием grep:

grep -o '".*"' file.txt

или

grep -o \".*\" file.txt

, используя sed:

sed -r 's/(".*").*/\1/' file.txt

или

sed -r 's/\{.*\}//' file.txt

или даже:

sed 's/{.*//'
3
ответ дан 24 July 2018 в 20:06

Perl с группировкой (.*) тоже может это сделать:

$ perl -pe 's/"(.*)".*/"\1"/g' input.txt "xxxxx1" "xx2" "xx3 gsdd" "sdsdf xxx" "sdfsdf ccc dd" "dsdsf sfsdf" "sdfsdfsd" "sdfsdff" "sdfsdfdff sdfs" "sdfsdsds sdfsdf d" "sdfsdfs sdf sdfsdf" "sdfsdfsdf sdf"

Фокус в том, что мы сопоставляем целую строку и используем "(.*)" для обработки всего между двойными кавычками как одной группой. Мы заменяем эту целую строку группой, которую мы сопоставляем, обращаясь к ней через часть \1.

2
ответ дан 24 July 2018 в 20:06

Другие вопросы по тегам:

Похожие вопросы: