Shell 价值观与条件的交换?
我有一个以下文件,我想交换以下格式的值:数字(最多3位)@数字(最多4位),后跟#或空格/行尾。 如果@后跟非数字,则不应交换它们 样本输入 样本输出:Shell 价值观与条件的交换?,shell,awk,conditional-statements,Shell,Awk,Conditional Statements,我有一个以下文件,我想交换以下格式的值:数字(最多3位)@数字(最多4位),后跟#或空格/行尾。 如果@后跟非数字,则不应交换它们 样本输入 样本输出: 尝试了以下逻辑,似乎需要拆分才能交换值,但无法检查条件以及如何将其保存在同一字段中 awk '{for(a=1;a<=NF;a++){if($a~/@/){split($a,b,"[@#]");val1=b[1];val2=b[2];print val1,val2}}}' file1 123 456 123 456
尝试了以下逻辑,似乎需要拆分才能交换值,但无法检查条件以及如何将其保存在同一字段中
awk '{for(a=1;a<=NF;a++){if($a~/@/){split($a,b,"[@#]");val1=b[1];val2=b[2];print val1,val2}}}' file1
123 456
123 456
awk'{for(a=1;a对于所显示的示例,您可以尝试以下内容。使用GNUawk编写并测试
awk -v RS='([0-9]{1,3}@[0-9]{1,4}#)+[0-9]{1,3}@[0-9]{1,4}' '
{
val=""
delete arr
delete arr2
num=split(RT,arr,"#")
for(i=1;i<=num;i++){
valTemp=""
split(arr[i],arr2,"@")
valTemp=arr2[2]"@"arr2[1]
val=(val?val "#":"")valTemp
}
ORS=val
}
1
' Input_file
awk-vrs='([0-9]{1,3}@[0-9]{1,4}#)+[0-9]{1,3}@[0-9]{1,4}”
{
val=“”
删除arr
删除arr2
num=拆分(RT,arr,“#”)
对于(i=1;i这个简单的gnu sed
应该能够完成这项工作:
sed-E的/\使用GNUsed
用于:
输入:
xyz123@456#1@34#1234@2
0123@456# 123@456#
123@456#1@34#123@212#3@456#1@34#123@2#123@xyzx
5678@124 111@110# 002@001 01@010 1111@000
1111@000
输出:
xyz123@456#34@1#1234@2
0123@456# 456@123#
456@123#34@1#212@123#456@3#34@1#2@123#123@xyzx
5678@124 110@111# 001@002 010@01 1111@000
1111@000
这将改变1234@5678
虽然它不是数字{1,3}@digits{1,4};以及xyz123@456
并且不会改变023@456#
@Bajajsahab,你能不能在这里确认一下,你是在寻找数字的数量,就像任何数字在计数时可能出现在1到4之间,而不是1到4之间?请确认一下。@aғsιη,好的,我现在回来了。这就是为什么我总是在我的答案中写一个swer仅根据显示的样本,否则将有很多假设,我们不知道什么是正确的,什么是不正确的:)我不认为000@1111
应更改为111@000
(可能只要求检查条件,但我相信这些条件不适用于预期输出),这不是OP的输出样本中显示的内容,我将等待OP确认这一点,谢谢。我对000@1111
它应该改变,但是1111@000
不应(根据OP在“数字(最多3位)@数字(最多4位)
中所说的内容),但让我们/他确认一下;但是你的RS
应该是RS='([0-9]{1,3}@[0-9]{1,4}})+[0-9]{1,3}@[0-9]{1,4}
;在某些情况下,你还可以添加额外的@,比如110@111#
更改为111@110#@
@aғsιη,行1111@000#bla@blabla
我测试了我的代码,但代码没有改变:)所以根据OP,cheers提到的样本和条件,regex工作正常。
sed -E 's/\b([[:digit:]]{1,3})@([[:digit:]]{1,4})(#|[[:blank:]]*|[[:blank:]]*$)/\2@\1\3/g' infile
xyz123@456#1@34#1234@2
0123@456# 123@456#
123@456#1@34#123@212#3@456#1@34#123@2#123@xyzx
5678@124 111@110# 002@001 01@010 1111@000
1111@000
xyz123@456#34@1#1234@2
0123@456# 456@123#
456@123#34@1#212@123#456@3#34@1#2@123#123@xyzx
5678@124 110@111# 001@002 010@01 1111@000
1111@000