سؤال

إذا كان لدي سلسلة مع فاصلة هارب مثل ذلك:

a,b,{c\,d\,e},f,g

كيف يمكنني استخدام AWK لتحليل ذلك في العناصر التالية؟

a
b
{c\,d\,e}
f
g
هل كانت مفيدة؟

المحلول

{
   split($0, a, /,/)
   j=1
   for(i=1; i<=length(a); ++i) {
      if(match(b[j], /\\$/)) {
         b[j]=b[j] "," a[i]
      } else {
         b[++j] = a[i]
      }
   }
   for(k=2; k<=length(b); ++k) {
      print b[k]
   }
}
  1. انقسام في الصفيف a, ، استخدام ',"كما محدد
  2. بناء صفيف b من عند a, ، دمج الخطوط التي تنتهي في "\'
  3. طباعة صفيف b (ملاحظة: يبدأ في 2 منذ البند الأول فارغا)

هذا الحل يفترض (الآن) ذلك ","هو الحرف الوحيد الذي هرب من أي وقت مضى\"- هذا، ليست هناك حاجة للتعامل مع أي \\ في المدخلات، ولا توجد مجموعات غريبة مثل \\\,\\,\\\\,,\,.

نصائح أخرى

{
  gsub("\\\\,", "!Q!")
  n = split($0, a, ",")
  for (i = 1; i <= n; ++i) {
    gsub("!Q!", "\\,", a[i])
    print a[i]
  }
}

لا أعتقد أن AWK لديه أي دعم مدمج لشيء مثل هذا. إليك حل ليس تقريبا قصيرا مثل DigitalRoss، ولكن يجب ألا يكون للخطر من أي وقت مضى ضرب عن طريق الخطأ السلسلة المكتوبة (! Q!). منذ اختباراتها مع if, ، يمكنك أيضا تمديده ليكون حذرين حول ما إذا كان لديك بالفعل \\, في نهاية السلسلة الخاصة بك، يجب أن يكون مائل هارب، وليس فاصلة.

BEGIN {
    FS = ","
}

{
    curfield=1
    for (i=1; i<=NF; i++) {
        if (substr($i,length($i)) == "\\") {
            fields[curfield] = fields[curfield] substr($i,1,length($i)-1) FS
        } else {
            fields[curfield] = fields[curfield] $i
            curfield++
        }
    }
    nf = curfield - 1
    for (i=1; i<=nf; i++) {
        printf("%d: %s   ",i,fields[i])
    }
    printf("\n")
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top