Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在unix中追加2个列变量_Shell_Unix_Awk - Fatal编程技术网

Shell 在unix中追加2个列变量

Shell 在unix中追加2个列变量,shell,unix,awk,Shell,Unix,Awk,我有一个文件如下。 file1.csv H,2 A:B,pq D,34 C:B,wq D,64 F:B,rq D,6 R:B,tq 我想将第二列的格式设置如下 H,02 0A:0B,pq D,34 0C:0B,wq D,64 0F:0B,rq D,06 0R:0B,tq 我可以分离列并格式化它,但不能合并它 我使用以下命令 formated_nums =`awk -F"," '{print $2}' file1.csv | awk '{print $1}' | awk '{if(length

我有一个文件如下。 file1.csv

H,2 A:B,pq
D,34 C:B,wq
D,64 F:B,rq
D,6 R:B,tq
我想将第二列的格式设置如下

H,02 0A:0B,pq
D,34 0C:0B,wq
D,64 0F:0B,rq
D,06 0R:0B,tq
我可以分离列并格式化它,但不能合并它 我使用以下命令

formated_nums =`awk -F"," '{print $2}' file1.csv | awk '{print $1}' | awk '{if(length($1)!=2){$1="0"$1}}1'`
formated_letters = `awk -F"," '{print $2}' file1.csv | awk '{print $2}' | awk -F":" '{if(length($1)!=2){$1="0"$1}; if(length($2)!=2){$2="0"$2}}1'| awk '{print $1":"$2}'`
现在我想合并格式化的字母和格式化的字母,中间留一个空格


我尝试了echo${formatted_nums}${formatted_letters},但它将变量作为行,并将整个内容作为行追加

基于gnu awk的替代awk解决方案:

awk -F"[, :]" '{sub($2,sprintf("%02d",$2));sub($3,"0" $3);sub($4,"0" $4)}1' file1

H,02 0A:0B,pq
D,34 0C:0B,wq
D,64 0F:0B,rq
D,06 0R:0B,tq

我在awk中发现的最简单的方法是使用另一个分隔符,包括空格和“:”,并重新格式化最终布局。唯一真正棘手的部分是数字,有时需要在前面添加一个0,但它的格式很简单,因为这里的数字永远不会大于2位

awk -F '[[:blank:],:]' '{printf("%s,%02d 0%s:0%s,%s", $1, $2, $3, $4, $5)}' YourFile

假设您的数据格式相同,没有更大的最新字段,字段内有空格或其他分隔符,听起来您真正想要的是:

$ awk '
    BEGIN { FS=OFS=","; p=2 }
    { split($2,t,/[ :]/); for (i in t) {n=length(t[i]); t[i] = (n<p ? sprintf("%0*s",p-n,0) : "") t[i]; $2=t[1]" "t[2]":"t[3]} }
    1
' file
H,02 0A:0B,pq
D,34 0C:0B,wq
D,64 0F:0B,rq
D,06 0R:0B,tq

使用printf而不是在末尾添加新行的print。请参阅其他回复以避免管道awk。Awk功能强大,可以轻松处理这样的双重信息,这是专为。在一个现已删除的答案下面的评论中,你说它对H,20A:B,pq这样的输入不起作用。显然,我们所要做的就是你告诉我们的,所以如果你需要处理像那样的输入或其他任何东西,那么你的问题就是将其包含在你的示例输入/输出中。请在其他人浪费时间为您提供基于示例输入的解决方案之前尽快这样做,因为示例输入不能反映您的真实输入,因此无法工作。这没有什么gawk的具体内容,它在任何awk中都会表现相同。如果输入包含regexp或backreference元字符,它就无法工作。