我有一個主 shell,可以將文本從源檔案重新格式化為目標檔案:
來源 :
Libelléacte;CHAR(20);Libellé de l'acte;
目標 :
* Libellé de l'acte.
05 Libelléacte PIC X(20).
我希望我只洗掉第一個引數的變音符號。我嘗試使用 iconv 命令將我的檔案轉換為 ascii//TRANSLIT//IGNORE,但它洗掉了所有變音符號,這不是我想要的。
這是我的重新格式化代碼:
for f in $TEMP_DIRECTORY
do
b=$(basename "$f")
echo "Generating $f file in copy..";
awk -F ';' '
toupper($1)=="TABLE" {printf "01 %s.\n\n", $2; next}
toupper($1)=="EXTRACTION" {printf "01 %s.\n\n", $2; next}
{
result = $2
if ($2 ~ /^Numérique [0-9] (\.[0-9] )?$/) {
nr=split($2,a,"[ .]")
result = "PIC 9(" a[2] ")"
if (nr == 3) {
result = result ".v9(" a[3] ")"
}
}
sub(/CHAR/,"PIC X", result);
sub(/Char/,"PIC X", result);
sub(/char/,"PIC X", result);
sub(/Entier/,"PIC 9(9)", result);
sub(/entier/,"PIC 9(9)", result);
gsub(/user/,"user-field");
gsub(/User/,"user-field");
gsub("/","_");
printf " * %s.\n\n 05 %s %s.\n\n", $3, $1, result;
}' "$f" > "$TARGET_DIRECTORY/${b%%.*}.cpy"
done
我只需要更改第一個引數,這樣我就可以得到這個輸出:
* Libellé de l'acte.
05 Libelleacte PIC X(20).
uj5u.com熱心網友回復:
首先,我將使用cut獲取分號之前的第一個引數,然后iconv轉寫為ASCII,最后tr通過洗掉[:punct:]POSIX 字符類來洗掉非字母數字。
cat test | cut -d \; -f 1 | iconv -f UTF-8 -t ASCII//TRANSLIT | tr -d "[:punct:]"
uj5u.com熱心網友回復:
我在下面的原始答案是iconv每行輸入呼叫一次,這會更有效率:
$ iconv -f utf8 -t ascii//ignore file |
awk 'BEGIN{FS=OFS=";"} NR==FNR{a[NR]=$1; next} {$1=a[FNR]; print}' - file
Libellacte;CHAR(20);Libellé de l'acte;
或者,如果您愿意:
$ paste -d';' <(cut -d';' -f1 file | iconv -f utf8 -t ascii//ignore) <(cut -d';' -f2- file)
Libellacte;CHAR(20);Libellé de l'acte;
或者如果您總是知道輸入欄位的數量:
$ iconv -f utf8 -t ascii//ignore file | paste -d';' - file | cut -d';' -f1,6-
Libellacte;CHAR(20);Libellé de l'acte;
很多選擇。
如果上面的呼叫不正確,請將iconv命令更改為您已經知道的任何內容(假設您在問題中說I tried to convert my file to ascii//TRANSLIT//IGNORE with iconv command but it removes all diacritics)。
原答案:
#!/usr/bin/env bash
while IFS=';' read -r f1 rest; do
printf '%s;%s\n' "$(iconv -f utf8 -t ascii//ignore <<<"$f1")" "$rest"
done < file
Libellacte;CHAR(20);Libellé de l'acte;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409670.html
標籤:
