Text-Processing
如果列有多個值,則分別複製每個值的行
我有一個具有以下格式的文件,每列由製表符分隔:
C1 C2 C3 a b,c d e f,g,h i j k l ...
現在我需要根據第二列中用逗號分隔的值的數量(如果是這種情況)來確定行數。這些行必須具有其中一個值,而不是其他值。結果將是這樣的:
C1 C2 C3 a b d a c d e f i e g i e h i j k l ... ...
由於這是由於盡快工作,我剛剛製作了一個*不要在家執行此操作的*腳本,用 逐行閱讀
while
,因為我缺乏相關技能awk
,或者沒有使用其他工具探索其他可能的解決方案。腳本如下:同時我正在修改劇本
# DON'T DO THIS AT HOME SCRIPT > duplicados.txt while IFS= read -r line; do # get the value of the column of interest cues="$(echo "$line" | awk -F'\t' '{ print $18 }')" # if the column has commas then it has multiple values if [[ "$cues" =~ , ]]; then # count the commas c=$(printf "%s" "$cues" | sed 's/[^,]*//g' | wc -c) # loop according to the number of commas for i in $(seq $(($c + 1))); do # get each value of the column of interest according to the position cue="$(echo "$cues" | awk -F',' -v c=$i '{ print $c; ++c }')" # save the line to a file substituting the whole column for the value echo "$line" | sed "s;$cues;$cue;" >> duplicados.txt done continue fi # save the single value lines echo "$line" >> duplicados.txt done < inmuebles.txt
有了這個,我得到了想要的結果(據我所知)。正如你可以想像的那樣,腳本很慢而且效率很低。我怎麼能用
awk
或其他工具做到這一點?真實數據的樣本是這樣的,感興趣的列是數字 18:
1409233 UNION VIAMONTE Estatal Provincial DGEP 3321 VIAMONTE -33.7447365;-63.0997115 Rural Aglomerado 140273900 140273900-ESCUELA NICOLAS AVELLANEDA 1402961 UNION SAN MARCOS SUD Estatal Provincial DGEA, DGEI, DGEP 3029, 3311, Z11 SAN MARCOS SUD -32.629557;-62.483976 / -32.6302699949582;-62.4824499999125 / -32.632417;-62.484932 Urbano 140049404, 140164000, 140170100, 140173100 140049404-C.E.N.M.A. N° 201 ANEXO SEDE SAN MARCOS SUD, 140164000-C.E.N.P.A. N° 13 CASA DE LA CULTURA(DOC:BERSANO), 140170100-ESCUELA HIPOLITO BUCHARDO, 140173100-J.DE INF. HIPOLITO BUCHARDO 1402960 UNION SAN ANTONIO DE LITIN Estatal Provincial DGEA, DGEI, DGETyFP 3029, TZONAXI, Z11 SAN ANTONIO DE LITIN 3601300101020009 360102097366 0250347 SI / SI -32.212126;-62.635999 / -32.2122558;-62.6360432 / -32.2131931096409;-62.6291815804363 Rural Aglomerado 140049401, 140313000, 140313300, 140483400, 140499800 140049401-C.E.N.M.A. N° 201 ANEXO SAN ANTONIO DE LITIN, 140313000-I.P.E.A. Nº 214. MANUEL BELGRANO, 140313300-J.DE INF. PABLO A. PIZZURNO, 140483400-C.E.N.P.A. DE SAN ANTONIO DE LITIN, 140499800-C.E.N.P.A. B DE SAN ANTONIO DE LITIN
您可以
awk
通過拆分複合列,
並循環結果來做到這一點:awk -F'\t' 'BEGIN{OFS=FS} {n=split($2,a,/,/); for(i=1;i<=n;i++){$2 = a[i]; print}}' file
也許更乾淨,你可以用Miller來做- 特別是使用nest 動詞:
$ cat file C1 C2 C3 a b,c d e f,g,h i j k l $ mlr --tsv nest --explode --values --across-records --nested-fs ',' -f C2 file C1 C2 C3 a b d a c d e f i e g i e h i j k l
更緊湊
--explode --values --across-records --nested-fs ','
的可以替換為--evar ','