у меня естьПСВфайл test1.psv с тремя столбцами данных, как показано ниже, при открытии с помощьюawk, отображает данные в одном столбце.
xxxx|0001|rose
yyyy|8768|lotus
fgsh|6543|lilly
на самом деле это должен быть файл с разделителями "|" и 3 столбцами, но когда я print $1
, все столбцы появляются в качестве первого столбца, как показано ниже
cat test1.psv |awk '{print $1}'
выходы:
xxxx|0001|rose
yyyy|8768|lotus
fgsh|6543|lilly
но результат должен быть:
xxxx
yyyy
fgsh
если мы print $2
, результат должен быть:
0001
8768
6543
решение1
Вам необходимо установить разделитель полей следующим |
образом -F
(также вам не нужно cat
):
$ awk -F '|' '{print $1}' test1.csv
xxxx
yyyy
fgsh
$ awk -F '|' '{print $2}' test1.csv
0001
8768
6543
$ awk -F '|' '{print $3}' test1.csv
rose
lotus
lillyw
(Обратите внимание, что $
здесь естьприглашение командной строки
используется для обозначения начала новой строки, а не как часть команды).
-F
определяетсяPOSIXи должен быть портативным.
решение2
awkбудет предполагать, что файл разделен табуляцией или строкой из одного или нескольких пробелов, поэтому для использования файла значений, разделенных конвейером, мы сообщаем awk, что наши поля разделены символом вертикальной черты |.
Из первой ссылки в предложении выше:
Значение (разделитель полей) можно изменить в программе awk с помощью оператора присваивания '=' (см. раздел Выражения присваивания). Часто это нужно делать в начале выполнения, до того, как будет обработан какой-либо ввод, чтобы самая первая запись была прочитана с правильным разделителем. Для этого используйте специальный шаблон BEGIN (см. раздел Специальные шаблоны BEGIN и END).
Например, здесь мы задаем значение (разделитель полей, он жеФС) к строке "|":
cat test1.psv | awk 'BEGIN { FS = "|" } ; { print $1 }'
решение3
чтобы просто вернуть только определенный столбец файла с разделителями, выполните эту команду
cut -d'|' -f1 test1.csv
чтобы вернуть поле 1 ... измените указанное выше на -f2, чтобы вернуть 2-й столбец ... параметр -d определяет символ-разделитель, в данном случае '|'
обычно создают конвейер из многих команд, связанных вместе с помощью конвейера | поэтому выше также можно написать
cat test1.csv | cut -d'|' -f1
решение4
awk -F "|" '{print $1}' p.txt ===============> To get first column
awk -F "|" '{print $2}' p.txt===================> To get second column
python
Below python code drives first and second column
#!/usr/bin/python
k=open('p.txt','r')
for i in k:
print " ".join(i.split("|")[0:2])