У меня есть файл, содержащий данные, разделенные |
.
Пример: (Ввод)
a|b|c|d`LF`
D|e
a1|b1|c1|d1`LF`
d2|e1\n
Вывод: (Удалено LF
из 4-го столбца)
a|b|c|dD|e
a1|b1|c1|d1d2|e1\n
Я хочу удалить LF
из определенного столбца, используя sed
. Можно ли удалить символы LF
из определенного столбца.
Я думаю, что ваш входной файл был создан на платформе Windows с окончанием строки CR (возврат каретки);
если вы сделаете cat -e filename.txt
, вы увидите что-то подобное (обратите внимание на символ ^ M
):
a|b|c|d^M$
D|e$
a1|b1|c1|d1^M$
d2|e1\n$
для этого вы можете сделать:
CR=$'\r' ; sed -E ":a /${CR}$/ { N; s/\n//; ta; }; s/${CR}//g;" infile.txt
a|b|c|dD|e
a1|b1|c1|d1d2|e1\n
Пусть printf
сгенерирует символ возврата каретки с CR = $ (printf% s '\ r')
, если ваша оболочка не распознает синтаксис ANSI-C Quоты , например $ '\ r'
.
Вы хотите сделать что-то вроде:
#!/usr/bin/awk -f
BEGIN { FS = "|"; OFS = "|"; i=0 }
{
a[i]=(a[i] ?
sprintf("%s%s\n", a[i], $0) : sprintf("%s", $0))
if(NF!=4) {
++i
}
}
END {
for(e in a) {
printf("%s", a[e])
}
}
И вы запускаете его с помощью -f
:
awk -f script.awk text.txt