簡體   English   中英

在awk shell命令中替換變量中的特殊字符

[英]Replace special characters in variable in awk shell command

我當前正在執行以下命令:

awk 'BEGIN { FS="," ; getline ; H=$0 } N != $3 { N=$3 ; print H > "/Directory/FILE_"$3"_DOWNLOAD.csv" } { print > "/Directory/FILE_"$3"_DOWNLOAD.csv" }' /Directory/FILE_ALL_DOWNLOAD.csv

這將從CSV文件中的第三個位置獲取值,並為每個不同的$ 3值創建一個CSV。 根據需要工作。

輸入文件如下所示:

Name, Amount, ID
"ABC", "100.00", "0000001"
"DEF", "50.00", "0000001"
"GHI", "25.00", "0000002"

不幸的是,我無法控制源(CSV)表中的值$ 3的值,但是我想從中消除特殊的(非字母數字)字符。 我嘗試了以下方法來實現這一目標,但失敗了……

awk 'BEGIN { FS="," ; getline ; H=$0 } N != $3 { N=$3 ; name=${$3//[^a-zA-Z_0-9]/}; print H > "/Directory/FILE_"$name"_DOWNLOAD.csv" } { print > "/Directory/FILE_"$name"_DOWNLOAD.csv" }' /Directory/FILE_ALL_DOWNLOAD.csv

有什么建議嗎? 我希望在一個命令中執行此操作,但是如果有人有一個bash腳本,那么答案會起作用。

如果您始終希望數字在CSV的最后一個字段中,並且知道每個字段都用引號引起來,則可以使用此awk從注釋中提供的輸入中提取值456

echo " 123.", "Company Name" " 456." | awk -F'[^a-zA-Z0-9]+' 'NF { print $(NF-1) }'

這將字段分隔符定義為任意數量的非字母數字字符,並檢索倒數第二個字段。

如果這足以可靠地檢索該值,則可以這樣構造文件名:

file = "/Directory/FILE_" $(NF-1) "_DOWNLOAD.csv"

並按原樣輸出到它。

絕對不是您應該使用getline工作,請參閱http://awk.info/?tip/getline

看起來您只想在每個$ 3命名文件中重現輸入文件的第一行。 那是:

awk -F, '
NR==1 { hdr=$0; next }
$3 != prev { prev=name=$3; gsub(/[^[:alnum:]_]/,"",name); $0 = hdr "\n" $0 }
{ print > ("/Directory/FILE_" name "_DOWNLOAD.csv") }
' /Directory/FILE_ALL_DOWNLOAD.csv

請注意,您必須始終在輸出重定向( > )的右邊加上表達式括號,否則可能會導致歧義,否則,不同的awk行為會有所不同。

如果願意,可以將所有內容放回一行。

bash變量擴展不會用單引號引起。

它們也不能在awk變量上執行。

話雖這么說,您不需要工作。

awk具有可以執行相同任務的字符串處理功能。 在這種情況下,您可能需要gsub函數。

這對您的要求無效嗎?

awk -F, 'a=NR==1{x=$0;next}
!a{gsub(/[^[:alnum:]]/,"",$3);print x"\n"$0 >> "/Directory/FILE_"$3"_DOWNLOAD.csv"}' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM