getline
читает в следующей строке. Вам не нужно его использовать. Текущая строка уже находится в $ 0
:
awk '{print NR, $0}' name_list.txt
Вы можете:
sed 's/[^:]*/"&"/g' /etc/passwd
То есть заключать в кавычки любую последовательность из 0 или более(*
)символов, кроме:
([^:]
).
Или с помощью специального инструмента обработки csv -, который имеет преимущество правильного цитирования (полей стиля csv -), содержащих символы двойных кавычек, а здесь также добавление заголовка:
mlr --icsvlite --ocsv --implicit-csv-header --fs : --quote-all label \
'User Name,Password,UID,GID,Gecos,Home Directory,Shell' /etc/passwd
Я сделал следующим способом
команда:
sed 's/:/"&"/g' filename | sed 's/^/"/'| sed 's/$/"/'
или,
sed 's/:/"&"/g; s/^/"/; s/$/"/' filename
выход:
"user1":"x":"1":"1":"User1":"/home/user1":"/bin/bash"
"user2":"x":"2":"2":"User2":"/home/user2":"/bin/bash"
"user3":"x":"3":"3":"User3":"/home/user3":"/bin/bash"
Использованиеawk
(не такое короткое, как решение sed
, хотя):
$ awk -F ':' -v OFS='":"' '{ $1 = "\"" $1; $NF = $NF "\""; print }' file
"user1":"x":"1":"1":"User1":"/home/user1":"/bin/bash"
"user2":"x":"2":"2":"User2":"/home/user2":"/bin/bash"
"user3":"x":"3":"3":"User3":"/home/user3":"/bin/bash"
Это устанавливает разделитель выходного поля(OFS
)на строку ":"
, а затем добавляет "
к первому полю с разделителем:
-и добавляет то же самое к последнему полю. Затем он печатает полученную запись.
awk
снова, но перебирая поля, добавляя двойные кавычки к каждому перед выводом измененной записи:
awk -F ':' -v OFS=':' '{ for (i=1; i<=NF; ++i) $i=sprintf("\"%s\"", $i); print }' file
Чтение файла, как если бы это был:
-CSV-файл с разделителями, с использованием csvformat
из csvkit:
$ csvformat -d ':' -D ':' -U 1 file
"user1":"x":"1":"1":"User1":"/home/user1":"/bin/bash"
"user2":"x":"2":"2":"User2":"/home/user2":"/bin/bash"
"user3":"x":"3":"3":"User3":"/home/user3":"/bin/bash"
Здесь мы сообщаем csvformat
, что и входной, и выходной разделители полей должны быть :
и что мы хотим заключать в кавычки все поля независимо от того, нужны они на самом деле или нет.
Просто так, Руби:
ruby -rcsv -e '
csv_in = CSV.new File.new ARGV.shift, col_sep: ":"
csv_out = CSV.new $stdout, col_sep: ":", force_quotes: true
csv_in.each {|row| csv_out << row}
' /etc/passwd