استخدام sed لإزالة أحرف السطر الجديدة من منتصف الحقل
سؤال
البيانات التي لدي تبدو مثل هذا
a,b,c,d
a,b1
b2,c,d
A,B,C,D
ما يحدث هو أنه في الحقل 2 يوجد أحيانًا حرف سطر جديد في الحقل الثاني، لذلك يتم تقسيم السطر على سطرين
لقد وجدت حتى الآن نصًا برمجيًا sed يقوم بذلك كما يبدو
cat file| sed ':a;N;$!ba;s/\(\(b1\)\)\n/\1/g'
لكنني أجد صعوبة في الحصول على المجموعات الصحيحة من (.*,) لإنجاز هذا العمل لذا استبدلتها بـ b1 لتشغيل هذا المثال ولكن في العالم الحقيقي A وB وC وD عبارة عن حقول ذات أطوال مختلطة والمحتوى
النتيجة النهائية التي أبحث عنها هي هذه
a,b,c,d
a,b1b2,c,d
A.B,C,D
أي مساعدة هي محل تقدير كبير
شكرا مات
المحلول
لدي هنا حل ليس مثاليًا بعد - لكنني سأفكر فيه أكثر.إذا كان الإصدار الخاص بك sed
يدعم التعبيرات العادية الموسعة التي يمكنك القيام بها:
cat file | sed -r ':a;N;$!ba;s/((^|\n)([^,]+,){0,2}[^,]+)\n/\1/g'
سيعمل ذلك إذا كان هناك فاصل أسطر في أحد الأعمدة الثلاثة الأولى.حتى الآن لا يعمل بعد مع فواصل الأسطر المتعددة في "السطر".
توضيح:
(^|\n)
يطابق بداية السطر (resp.فاصل سطر)
[^,]+,
وسائل:مرة على الأقل (+
يعني حرفًا خامًا واحدًا أكثر)!="،" متبوعًا بـ "،"
([^,]+,){0,2}
يتطابق إذا كان هناك 0-2 أعمدة محددة بـ "،"
ال [^,]+
يعني أن هناك بعض الأحرف (واحدة على الأقل)!="،" بعد الأعمدة 0-2.
زائدة \n
يطابق فاصل الأسطر
لخص s
سيطابق الأمر جميع الأسطر التي تحتوي على 0-3 أعمدة مع فاصل أسطر في النهاية وسيستبدله بنفسه (\1
) باستثناء فاصل الأسطر الزائدة.
نصائح أخرى
في awk
Genacodicetagpre