我试图将第一列追加到每列如下。现有A B C D E F必填项:B A C A D A E A F A我已经对一组较小的列尝试了这种方法,如下所示;
A B C D E F
B A C A D A E A F A
cat file | awk '{print $2" "$1" "$3" "$1" "$4" "$1}"
50多列如何重复上述谢了, iis 瓦
mbskvtky1#
以下是另一个awk解决方案:
awk
$ echo 'A B C D E F' | awk '{for(i=2; i<=NF; i++) $i=$i " " $1; sub(/^[^ ]+ /, "")} 1' B A C A D A E A F A
omqzjyyz2#
这可能对你有用(GNU sed):
sed 'y/ /\n/;s/.*/echo "&" | sed "1h;1d;G"/e;y/\n/ /' file
将每个字段之间的空格转换为换行符。使用求值替换,对原始文件中的每一行应用sed的第二次调用,并复制/删除第一个字段,然后将副本附加到每个后续字段。最后,将所有引入的换行符转换回空格。
2hh7jdfx3#
无循环awk:
echo 'A B C D E F' |
gawk '($2 = __$2) gsub(" |$", " " $1 "&") sub(".+" __,_)^_' __='\773'
gsub()
mawk2 '($2 = __$2)(OFS = " "$1 " ")^!++NF sub(".+" __,_)' __='\767'
甚至更短的版本,不带尾随空格、printf、循环或END { }部分
printf
END { }
mawk 'gsub(" $|^[^ ]+" (OFS = " "$!_ " "),_, $!++NF)^_'
dauxcl2d4#
使用GNU awk且不带尾随换行符:
echo 'A B C D E F' | awk 'BEGIN{RS=OFS; ORS=""} NR==1{a=$1} NR>1{$1=$1; print s $0 OFS a; s=OFS}'
输出:
参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
91zkwejq5#
如果你的awk支持多字符RS,这里有另一个awk解决方案,它不会留下前导或尾随空间:
awk -v RS='[[:blank:]]+' 'NR==1 {s=$1; next} {printf "%s%s %s", (NR==2?"":" "), $1, s} END {print ""}' file B A C A D A E A F A
gr8qqesn6#
使用awk:
$ echo "A B C D E F" | awk '{for(i=2;i<=NF;i++) printf "%s", $i" "$1" "; printf "\n"}' B A C A D A E A F A
13z8s7eq7#
如果不需要前导或尾随空格,并且如果至少有2列,则仅重复第一列的值:
awk 'NF>1{ s="" for(i=2; i<=NF; i++) s=s (i==2 ? "" : OFS) $i OFS $1 print s }' file
输出
e5njpo688#
将第二个空格替换为第一列和一个临时字符,重复直到只剩下一个空格,将临时字符替换为空格并将第一列移到末尾。
echo 'A B C D E F' | sed -r ':a;s/([^ \r]*)[\r ]([^ ]*)( )/\1\r\2\r\1\r/;ta;s/\r/ /g; s/([^ ]*) (.*)/\2 \1/'
当输入在file中时,可以使用
file
sed -rf <(echo "s/[^ ]* //;";sed -r 's/([^ ]*).*/s#( |$)# \1 #g/' file) file
8条答案
按热度按时间mbskvtky1#
以下是另一个
awk
解决方案:omqzjyyz2#
这可能对你有用(GNU sed):
将每个字段之间的空格转换为换行符。
使用求值替换,对原始文件中的每一行应用sed的第二次调用,并复制/删除第一个字段,然后将副本附加到每个后续字段。
最后,将所有引入的换行符转换回空格。
2hh7jdfx3#
无循环
awk
:gsub()
调用换取1个额外的尾随空间 *:甚至更短的版本,不带尾随空格、
printf
、循环或END { }
部分dauxcl2d4#
使用GNU
awk
且不带尾随换行符:输出:
参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
91zkwejq5#
如果你的awk支持多字符RS,这里有另一个awk解决方案,它不会留下前导或尾随空间:
gr8qqesn6#
使用awk:
13z8s7eq7#
如果不需要前导或尾随空格,并且如果至少有2列,则仅重复第一列的值:
输出
e5njpo688#
将第二个空格替换为第一列和一个临时字符,
重复直到只剩下一个空格,
将临时字符替换为空格并将第一列移到末尾。
当输入在
file
中时,可以使用